ich würde mich gerne mit eurer Hilfe versichern, dass ich das Thema Threads und Signals/Slots richtig verstanden habe.
Folgendes Szenario:
Thread1 empfängt Daten an einem UdpSocket. Diese schickt er als QByteArray mittels Signal an Thread2 weiter. Signal und Slot sind nicht mittels Qt::DirectConnection verbunden:
Code: Alles auswählen
result = connect(thread1,SIGNAL(datagramReceivedSignal(QByteArray)),thread2,SLOT(rxDatagramSlot(QByteArray)));
Code: Alles auswählen
void Thread2::rxDatagramSlot(QByteArray oDatagram)
{
//store datagram
this->m_pRxDatagram = new QByteArray(oDatagram);
if (!isRunning())
{
start(LowPriority);
}
else
{
m_bRxDataAvailable = true;
m_oWaitCondition.wakeOne();
}
}
Code: Alles auswählen
void Thread2::run()
{
forever
{
//wait
m_oWaitCondition.wait(&m_oMutex);
if(m_bRxDataAvailable == true)
{
//do sth. useful
m_bRxDataAvailable = false;
}
}
}
Wenn ich die Doku richtig verstanden habe, muss ich den Code im Slot und den Code in run() nicht mit einem Mutex schützen. Wenn Thread2 gerade wartet, wenn Thread1 das Signal schickt, führt Thread2 zunächst den Code im Slot aus (keine DirectConnection) und erst danach den Code in run(). Wenn Thread1 das Signal schickt, wenn Thread2 gerade in run() zu Gange ist, wird erst der code bis zu wait() ausgeführt und dann der Slot.
Ist das richtig?
Wenn ich Signal und Slot mit Qt::DirectConnection verbunden hätte, müsste ich den Code mit einem Mutex schützen, denn dann könnte die Membervariable von Thread1 im Slot verändert werden, solange Thread2 gerade run() abarbeitet.
Korrekt?
Bin mir nicht ganz sicher ob mein Verständnis richtig ist, da ich in der Doku nicht gefunden habe was gilt, wenn sowohl das Sender-Objekt als auch das Empfänger-Objekt selbst ein Thread ist und es sich nicht um Objekte handelt, die eben in unterschiedlichen Threads leben.
Gruß M@g