eine Frage:
Ich bin gerade dabei ein Programm mit 2 Threads zu schreiben: Dem GUI-Thread und einem Thread, der sich um das ansteuern von Hardware kümmert. Dabei wird dieser Thread von einer Klasse(THWDriver) gekapselt. Dessen Konstruktor startet das Thread working Objekt (THWDriverThread:QObject), um es mittels movetoThread in einen QThread zu transferieren:
Code: Alles auswählen
THWDriver::THWDriver()
{
HWDriverObject = new THWDriverThread();
HWDriverThread = new QThreadEx();
connect(HWDriverObject,SIGNAL(hwdtSigGotTemperature(THWTempSensorID , float ,bool)),
this,SLOT (hwdSloGotTemperature(THWTempSensorID , float ,bool)),Qt::QueuedConnection); //und viele mehr
HWDriverObject->moveToThread(HWDriverThread);
HWDriverThread->start();
}
THWDriver::~THWDriver(){
HWDriverObject->deleteLater();
HWDriverThread->deleteLater();
HWDriverThread->quit();
}
THWDriverThread::THWDriverThread()
{
QMetaObject::invokeMethod(this,
"init",
Qt::QueuedConnection);//a "hack" for making all objects beeing always in this thread
}
void THWDriverThread::init(){
serial = new AbstractSerial(this);
wrapper = new Wrapper();
}
void THWDriverThread::CloseEverythingForLeaving(){
if (wrapper)
wrapper->closeAllSpectrometers();
delete wrapper;
wrapper = NULL;
if (serial)
serial->close();
delete serial;
serial = NULL;
}
THWDriverThread::~THWDriverThread(){
CloseEverythingForLeaving();
}
Jetzt beginnen die Probleme: wenn ich mein Programm schließe, also ~THWDriver mit
Code: Alles auswählen
delete hwdriver
Wenn ich CloseEverythingForLeaving manuell vor dem Schließen des Programms mit einem Signal von einem Button aufrufe, funktioniert auch alles.
Also meine Frage:
Mache ich etwas systematisch falsch mit der Threadkonstruktion oder Destruktion?
Gibt es eine Möglichkeit, das Schließem des GUI-Threads zu verzögern, sodass ich in aller Ruhe den CloseEverythingForLeaving Slot aufrufen kann?
Viele Grüße,
Arne