QT syncExec

Fórumok

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ások

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