Frage zu QSemaphoren in QThreads
Verfasst: 7. Oktober 2009 15:07
Hallo,
ich habe eine Frage an euch. Eins vorab, ich benutze Visual Studio 2008 + QT 4.5. Ich möchte in einer Klasse die ich von QThread abgeleitet hab zwei semaphoren benutzen.
Die erste soll zum steuern meines Ablaufs sein in run().
Irgendwelche methoden, die meine Klasse verfügt sollen die workflowSemaphore->release(); aufrufen, damit die eigentlich Aufgabe ausgeführt werden.
Ich möchte nach dem Senden prüfen, ob das was ich zurück bekommen okay ist oder nicht. Entsprechend über einen Rückgabewert true oder false meinen anderen Thread der GUI die diese Methode sendUdpPackage(); aufruft, drauf reagieren kann.
Dabei blockiert sich logischer Weise meine Gui, die diese Methode aufruft. Auch wenn es so funktioniert, finde ich es nicht schön gelöst. Kann mir da einer von einen Tipp geben, wie ich das besser lösen kann.
Danke
Gruss
Apollinaris
ich habe eine Frage an euch. Eins vorab, ich benutze Visual Studio 2008 + QT 4.5. Ich möchte in einer Klasse die ich von QThread abgeleitet hab zwei semaphoren benutzen.
Die erste soll zum steuern meines Ablaufs sein in run().
Code: Alles auswählen
void run()
{
// Thread-Init:
connect( udpSocket, SIGNAL(readyRead() ), this, SLOT( getUdpPackage() ) );
timer = new QTimer;
connect( timer, SIGNAL( timeout() ), this, SLOT( timeOut() ) );
timer->setInterval( TIMEOUT );
semaphore = new QSemaphore;
workflowSemaphore = new QSemaphore;
//Port zum horchen erzuegen
udpSocket->bind( ... );
while(1)
{
workflowSemaphore->acquire();
*
*
*
}
udpSocket->close();
delete udpSocket;
}
Ich möchte nach dem Senden prüfen, ob das was ich zurück bekommen okay ist oder nicht. Entsprechend über einen Rückgabewert true oder false meinen anderen Thread der GUI die diese Methode sendUdpPackage(); aufruft, drauf reagieren kann.
Code: Alles auswählen
bool sendUdpPackage()
{
*
*
udpSocket->writeDatagram( ... );
semaphore->acquire();
// Empfangene Variable prüfen
// Und entsprechenden Rückgabe Wert
if ( Var == OKAY)
return true;
else
return false;
}
void getUdpPackage()
{
*
*
udpSocket->readDatagram( ... );
// Empfangene Variable besetzen
Var = ... ;
semaphore->release();
}
Danke
Gruss
Apollinaris