QT syncExec

 ( asch | 2010. április 20., kedd - 5:41 )

Sziasztok!

QT-ben kellene egy worker thread-ről a GUI szálon végrehajtanom egy metódust. Visszatérési értékre is szükségem van, tehát a worker thread-nek várakozni kell amig a GUI szál végre nem hajtja a metódust, illetve vissza kell tudni adni a választ. Ezt hogy kell QT-ben megcsinálni?

Ha a leírás érthetetlen lenne, itt van, hogy hogy csinálnám ugyanezt Java-SWT-ben:

display.syncExec(new Runnable(){public void run()
{
// do stuff on GUI thread
setReturnValue(42);
}
});
return getReturnValue();

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Erre való a signal-slot mechanizmus. De egy tök egyszerű mutex-szel is meg lehet oldani.

Én a mutex-et jobban szeretem, de ízlés dolga. (Így annyira nem qt-s a cucc.)

Annyi van még, hogy a Qt-s megoldáshoz futnia kell a QThread osztály exec() fv-ének.


thread header:

class QMyThread : public QThread
{
public:
QMyThread( void );
protected:
void fut_valami_code( void );
protected slots:
void eredmenyre_varo_slot( pointer * eredmeny );
signals:
void valamit_akar_a_guitol( pointer * ide );
private:
pointer * eredmeny;
};

thread cpp:

QMyThread::QMyThread( void )
: van_eredmeny(0)
{
connect( p_gui, SIGNAL(eredmeny_kesz(pointer *)), this, SLOT(eredmenyre_varo_slot(pointer *)) );
connect( this, SIGNAL(valamit_akar_a_guitol(pointer *)), p_gui, SLOT(csinalom(pointer *)) );
}

void QMyThread::fut_valami_code(void)
{
...
emit valamit_akar_a_guitol( this->eredmeny );
}

void QMyThread::eredmenyre_varo_slot( pointer * eredmeny )
{
this->eredmeny = eredmeny;
//eredmeny hasznalhato
...
}

gui header:

class QGui : QWidget
{
...
public slots:
void csinalom(pointer * value);
signals:
void eredmeny_kesz(pointer * value);
};

gui cpp:

void QGui::csinalom(pointer * value)
{
// azt csinalsz, amit akarsz, de a pointert töltsd fel mindenképp, ha annak a 0 érékét vizsgálod
emit eredmeny_kesz( value );
}

--
http://www.naszta.hu

És ha még van annyi nehezítés, hogy a szál amiről hívom nem QT-s szál, hanem Java thread-ből egy JNI hívás?

Java-ul nem értek, bocs. :)
--
http://www.naszta.hu

Ez már perverz. Hogy éred el a Qt GUI-t egyáltalán? (Kicsit részletesebben felvázolhatnád a dolgot.)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

Jambi gondolom...
--

()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Nem hiszem, de ha igen, akkor a signal-slot jó lehet ott is...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

A lenyeg, hogy letre kell hoznod egy uj szalat is, es az osszes QWidgetekkel kapcsolatos muveletet at kell pakolnod arra a szalra (QMetaObject::invoke). Annak a szalnak kell futtani a Qt message loopot (QApplication::exec).

----------------------
while (!sleep) sheep++;