Alles rund um die Programmierung mit Qt
surfman19
Beiträge: 52 Registriert: 22. August 2008 18:20
Beitrag
von surfman19 » 11. November 2008 13:26
hi,
ich habe eine callback funktion und einen thread
die callback funktion wird aufgerufen und je nach dem soll sie eine QWaitCondition setzen. der thread wartet mit QWaitCondition::wait darauf.
kann man das QWaitCondition::wait zwei mal hintereinander machen? bei mir klappt es nicht;/
lg
Ginsengelf
Beiträge: 79 Registriert: 2. Mai 2007 10:21
Beitrag
von Ginsengelf » 11. November 2008 16:31
Moin, kannst du mal einen Happen Code posten?
Ginsengelf
surfman19
Beiträge: 52 Registriert: 22. August 2008 18:20
Beitrag
von surfman19 » 12. November 2008 08:55
Code: Alles auswählen
QWaitCondition Unterspannung_false_cond;
QWaitCondition Unterspannung_true_cond;
QMutex wait_cond_untersp_false_mutex;
QMutex wait_cond_untersp_true_mutex;
bool enable_flag = false;
QMutex m;
/* Callback Funktion */
void BabyLin::signalHandler(BL_signal_t signal)
{
if(signal.index == 183)
{
if(signal.value == 1)
{
/* wake up one thread waiting on this condition variable */
Unterspannung_true_cond.wakeAll();
}
else if(signal.value == 0)
{
m.lock();
if(enable_flag == true)
{
m.unlock();
/* wake up one thread waiting on this condition variable */
Unterspannung_false_cond.wakeAll();
}
else
{
m.unlock();
}
}
}
}
void MyThread::run()
{
...
wait_cond_untersp_true_mutex.lock();
wait_cond_untersp_false_mutex.lock();
...
Unterspannung_false_cond.wait(&wait_cond_untersp_false_mutex); // da geht er nicht weiter obwohl Unterspannung_false_cond.wakeAll(); aufgerufen wurde...
...
}
pfid
Beiträge: 535 Registriert: 22. Februar 2008 16:59
Beitrag
von pfid » 12. November 2008 08:59
Abgesehn davon dass ich die Konstruktion nicht verstehe, und die Bezeichnungen grauenhaft finde (
):
Hat ein anderer Thread das Mutex gelockt?
[edit] warum sind Waitconds & Mutex keine Membervariablen der Threadklasse?
surfman19
Beiträge: 52 Registriert: 22. August 2008 18:20
Beitrag
von surfman19 » 12. November 2008 09:02
[edit] warum sind Waitconds & Mutex keine Membervariablen der Threadklasse?
weil signalHandler eine callback funktion ist![/quote]
surfman19
Beiträge: 52 Registriert: 22. August 2008 18:20
Beitrag
von surfman19 » 12. November 2008 09:07
Hat ein anderer Thread das Mutex gelockt?
nein, kann ich das im debugger überprüfen?
surfman19
Beiträge: 52 Registriert: 22. August 2008 18:20
Beitrag
von surfman19 » 12. November 2008 09:10
wait_cond_untersp_false_mutex.owner = 0....
wie kann das sein?
surfman19
Beiträge: 52 Registriert: 22. August 2008 18:20
Beitrag
von surfman19 » 12. November 2008 09:17
Code: Alles auswählen
void QWaitCondition::wakeAll()
{
// wake up the all threads in the queue
QMutexLocker locker(&d->mtx);
for (int i = 0; i < d->queue.size(); ++i) {
QWaitConditionEvent *current = d->queue.at(i);
SetEvent(current->event);
current->wokenUp = true;
}
}
wenn er den wakeall aufruf macht spring er nicht mal in die for schleife rein, was heisst das?
surfman19
Beiträge: 52 Registriert: 22. August 2008 18:20
Beitrag
von surfman19 » 12. November 2008 09:26
ich habe ne vermutung:
Unterspannung_false_cond.wakeAll(); wird vorher aufgerufen bevor er zu dem Unterspannung_false_cond.wait(&wait_cond_untersp_false_mutex); kommt....
ist das schlimm?
pfid
Beiträge: 535 Registriert: 22. Februar 2008 16:59
Beitrag
von pfid » 12. November 2008 09:33
surfman19 hat geschrieben: ich habe ne vermutung:
Unterspannung_false_cond.wakeAll(); wird vorher aufgerufen bevor er zu dem Unterspannung_false_cond.wait(&wait_cond_untersp_false_mutex); kommt....
ist das schlimm?
Ja sicher. Wenn kein Thread im wait steht, wird per wakeAll() auch keiner aufgeweckt. Und WENN er dann drin steht, kommt kein wakeAll() mehr.
surfman19
Beiträge: 52 Registriert: 22. August 2008 18:20
Beitrag
von surfman19 » 12. November 2008 09:34
hm, was mache ich da?
dachte an eine variable die ich setze und dann abfrage...das sollte funktionieren...ist das schön?
surfman19
Beiträge: 52 Registriert: 22. August 2008 18:20
Beitrag
von surfman19 » 12. November 2008 09:39
mit SetEvent, ResetEvent aus der Winapi würde das funktionieren?
bye
pfid
Beiträge: 535 Registriert: 22. Februar 2008 16:59
Beitrag
von pfid » 12. November 2008 09:46
Wie gesagt, ich verstehe deine ganze Konstruktion immer noch nicht.
Was macht denn dein Thread in der Zeit in der die Callback aufgerufen wird, er aber nicht im wait steht?
surfman19
Beiträge: 52 Registriert: 22. August 2008 18:20
Beitrag
von surfman19 » 12. November 2008 09:50
Der Thread sendet über die serielle schnitstelle daten, je nach dem wie der client die daten interpretiert wird ein signal gesetzt, das kann bevor er zum wait kommt sein oder danach....
der thread muss die daten aber noch fertig senden. deshalb kann er nicht gleich zum wait gehen...
pfid
Beiträge: 535 Registriert: 22. Februar 2008 16:59
Beitrag
von pfid » 12. November 2008 10:24
Dann kannst du die Callbackfunktion das Ergebnis ja in der Threadklasse speichern lassen, und der Thread prüft vor dem wait das Ergebnis.