Portál AbcLinuxu, 10. května 2025 05:32

Dotaz: QThread

Jardík avatar 2.6.2010 00:57 Jardík | skóre: 40 | blog: jarda_bloguje
QThread
Přečteno: 346×
Odpovědět | Admin
Mám nějaký QThread:
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:
Věřím v jednoho Boha.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Jardík avatar 2.6.2010 01:01 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: QThread
Odpovědět | | Sbalit | Link | Blokovat | Admin
A ještě vlastně jeden dotaz. Pokud bych zavolal disconnect až poté, co by thread emitnul signál, ale před tím, než by byl doručen, bude doručen, nebo ne?
Věřím v jednoho Boha.
2.6.2010 02:19 Murry | skóre: 16 | Brno
Rozbalit Rozbalit vše Re: QThread
Odpovědět | | Sbalit | Link | Blokovat | Admin

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().

Jardík avatar 2.6.2010 02:26 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: QThread
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)?
Věřím v jednoho Boha.
6.6.2010 15:46 Murry | skóre: 16 | Brno
Rozbalit Rozbalit vše Re: QThread
Neplatný pointer ne-e. Pokud object není platný už neregeruje signál.
6.6.2010 15:48 Murry | skóre: 16 | Brno
Rozbalit Rozbalit vše Re: QThread
Tím "není platný" myslím pokud už není v paměti.
7.6.2010 17:17 Sten
Rozbalit Rozbalit vše Re: QThread
Odpovědět | | Sbalit | Link | Blokovat | Admin
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.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.