Portál AbcLinuxu, 12. května 2025 05:07

Dotaz: qt4 thread + signal

29.5.2013 13:33 pou | skóre: 18
qt4 thread + signal
Přečteno: 219×
Odpovědět | Admin

Ahoj,
mám problém se signály a sloty. Mám vytvořené dvě třídy ve dvou vláknech (pomocí Thread run). V jednom vláknu získávám data a po zpracování se je snažím předat druhému vláknu pomocí signálu a slotu. Pro data mám vytvořenou vlastní strukturu.

Vše se zdá, že funguje (žádné hlášení při kompilaci). Při spuštění se data opravdu přesouvají z jednoho vlákna do druhého. ALE při zrušení aplikace(třídy A) vypíše QT následující hlášku:

Qt has caught an exception thrown from an event handler. Throwing exceptions from an event handler is not supported in Qt. You must reimplement QApplication notify() and catch all exceptions there.

 

(po reimplementaci notify jsem obdrzel stejnou hlasku).

 

Díky za každou odpověd!!!

 

 

Přidávám dulezite casti kodu:

class Global{
typedef struct mStruct{
int promenna;
int promenna2;
}mStruct;
};
Q_DECLARE_METATYPE(GFunction::mStruct)

class B{
signal:
mSignal(Global::mStruct);
};

class A:QThread{
~A{
this->terminate();
QThread::wait() ;
}

void run(){
B b;
qRegisterMetaType<Global::mStruct> ("Global::mStruct");
connect(&b,SIGNAL(mSignal(Global::mStruct)),this,SLOT(mSlot(Global::mStruct)));
exec();
}
slot:
mSlot(Global::mStruct){}
};

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

29.5.2013 13:57 pou | skóre: 18
Rozbalit Rozbalit vše Re: qt4 thread + signal
Odpovědět | | Sbalit | Link | Blokovat | Admin

Tak jsem zjistil,

že tu varovnou hlášku způsobuje pravděpodobně exec(), ale nevím co místo něj použít, možná eventloop???

30.5.2013 07:18 pou | skóre: 18
Rozbalit Rozbalit vše Re: qt4 thread + signal

Tak po dlouhém hledání a zkoušení různých věcí jsem zjistil, že problém dělá ukončování vlákna.

Je nutné použít this->quit(); potom uz hláška nevyskočí a vše je korektní.

29.5.2013 14:14 Roman Došek | skóre: 17 | blog: flare
Rozbalit Rozbalit vše Re: qt4 thread + signal
Odpovědět | | Sbalit | Link | Blokovat | Admin

Z toho kódu co je přiložený není úplně zřejmé, jakým způsobem máš obě třídy vytvořené, ale s největší pravděpodobností vůbec nemusíš ve třídě A dědit QThread. Někdy v Qt4.4 se totiž změnil způsob práce s QThread a nyní je to spíš interface, pomocí kterého se s vlákny manipuluje.

Dokumentace bohužel tuhle "malou" změnu nějak nereflektuje a neobsahuje korektní příklad použití.

Jak správně použít QThread je třeba tady.

29.5.2013 14:21 Roman Došek | skóre: 17 | blog: flare
Rozbalit Rozbalit vše Re: qt4 thread + signal
Případně dokumentace ke Qt5 už obsahuje lepší příklad, pokud _opravdu_ potřebuješ dědit QThread.
30.5.2013 07:22 pou | skóre: 18
Rozbalit Rozbalit vše Re: qt4 thread + signal
Tak to je dobrý vědět, díky za odkazy!!!!

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.