Superheftig hat geschrieben:Code: Alles auswählen
void cMeasureThread::run()
{
while (!m_Loop)
{
while(!m_StopThread) {
msleep(10);
}
StartMeasurement();
}
return;
}
So legt sich der Thread schlafen sobald du Stop Thread auf false setzt und versucht alle 10 msecs wieder zu starten.
Falls du StopThread wieder auf true setzt gehts also spätestens nach 10 msecs wieder weiter.
Das funktioniert fast. Wenn jedoch m_Loop einmal true wurde, lässt sich
der Thread nicht mehr starten. Auf m_StopThead wird korrekt reagiert.
Vielleicht die ganze Funktion in eine Forever-Schleife legen, und weitere
10ms für m_Loop einfügen.
Ich hab's jetzt mal so probiert:
Code: Alles auswählen
void cMeasureThread::run()
{
while (true)
{
if (m_Continue)
{
StartMeasurement();
if (!m_Loop)
{
m_Continue = false;
}
}
else
{
sleep(1);
}
}
return;
}
m_Loop steht auf true, wenn die Messung in einer Schleife ablaufen soll.
m_Continue wird von aussen auf false gesetzt, wenn der Thread
pausiert werden soll. Das sleep(1) war notwendig, weil der GUI-Thread
sonst keinen Einfluss nehmen kann. Jedoch durchläuft der Thread
beim Pausieren ständig die Forever-Schleife und fragt m_Continue ab.
Nicht gerade elegant.
Ich hab auch noch ein kleines Timing-Problem. Nachdem die GUI den
Thread pausiert hat, sollen die Messwerte auf 0 gesetzt werden. Das
Geschieht im GUI-Thread selber. Allerdings kann es vorkommen, dass
nach dem Setzen auf 0 gerade noch die letzten Messwerte auf dem
Messthread kommen. Die GUI aktualisiert die Messwerte natürlich
in ihren Anzeigen. Selbst wenn ich nach dem Setzen von m_Continue
durch die GUI noch 2 Sekunden warte, ist das Setzen auf 0 nicht
zuverlässig.
Mit den WaitConditions und Mutex hab ich stundenlang rumexperimen-
tiert. Nichts hat richtig funktioniert. Der GUI-Thread muss den Mess-
thread sperren, und auch wieder freigeben können.