Portál AbcLinuxu, 10. května 2025 05:32
class MyThread: public QThread { Q_OBJECT protected: virtual void run() { /* blabla */ } };A nějaký další objekt
class MyObj: public QObject { Q_OBJECT MyThread *th; public: MyObj() { th = new MyThread(); connect(th, SIGNAL(finished()), SLOT(onThreadFinished())); th->start(); } ~MyObj() { if (th) { th->wait(); delete th; } } protected slots: void onThreadFinished() { th->wait(); delete th; th = 0; } };Dotazy:
onThreadFinished() bude zavolán z threadu, kde je vytvořen MyObj?
onThreadFinished() bude zavolán pokud metoda MyThread->run doběhne. (Tzn. podle toho co máš za kód u /* blabla */ )
Pokud bude zavolán destruktor objektu dříve, než skončí thread, a já tam zavolám wait() a pak objekt zničím, předpokládám správně, že i když thread signál emitne, tak si při zničení uklidí vyslaný signál do jiného threadu a onThreadFinished() tedy zavolán nebude?
Nejsem si jist, zda-li je to či ono garantováno, v dokumentaci píší (pokud si pamatuji) něco jako že to není doporučeno spíš se má volat deleteLater().
spíš se má volat deleteLater()Jenže kdybych zavolal deleteLater(), tak by se mi ta metoda mohla zavolat s neplatným this pointerem (?)... nebo ten objekt odpojí při destrukci signál a ten se pak nezavolá (i když byl už vyslán)?
onThreadFinished() bude zavolán z threadu, kde je vytvořen MyObj?
Ano, sloty běží ve vlákně, ve kterém se nachází příjemce (ve výchozím módu funkce connect, lze změnit parametrem type, viz dokumentace). onThreadFinished je emitováno threadem poté, co opustí metodu run, ale zde zpracováno až poté, co thread objektu MyObj se dostane do event loopu (tzn. opustí metody objektu MyObj).
Pokud bude zavolán destruktor objektu dříve, než skončí thread, a já tam zavolám wait() a pak objekt zničím, předpokládám správně, že i když thread signál emitne, tak si při zničení uklidí vyslaný signál do jiného threadu a onThreadFinished() tedy zavolán nebude?
Po vložení signálu do mezi-threadové queue se signál nezruší smazáním objektu, který jej vyslal. onThreadFinished ale nebude doručen, protože bude příjemce zdestruován dříve, než bude možné ten signál doručit.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.