Seite 1 von 1

QWaitCondition::wait

Verfasst: 11. November 2008 13:26
von surfman19
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

Verfasst: 11. November 2008 16:31
von Ginsengelf
Moin, kannst du mal einen Happen Code posten?

Ginsengelf

Verfasst: 12. November 2008 08:55
von surfman19

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...
	...
}

Verfasst: 12. November 2008 08:59
von pfid
Abgesehn davon dass ich die Konstruktion nicht verstehe, und die Bezeichnungen grauenhaft finde ( :D ):

Hat ein anderer Thread das Mutex gelockt?

[edit] warum sind Waitconds & Mutex keine Membervariablen der Threadklasse?

Verfasst: 12. November 2008 09:02
von surfman19
[edit] warum sind Waitconds & Mutex keine Membervariablen der Threadklasse?
weil signalHandler eine callback funktion ist![/quote]

Verfasst: 12. November 2008 09:07
von surfman19
Hat ein anderer Thread das Mutex gelockt?
nein, kann ich das im debugger überprüfen?

Verfasst: 12. November 2008 09:10
von surfman19
wait_cond_untersp_false_mutex.owner = 0....

wie kann das sein?

Verfasst: 12. November 2008 09:17
von surfman19

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?

Verfasst: 12. November 2008 09:26
von surfman19
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?

Verfasst: 12. November 2008 09:33
von pfid
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.

Verfasst: 12. November 2008 09:34
von surfman19
hm, was mache ich da?

dachte an eine variable die ich setze und dann abfrage...das sollte funktionieren...ist das schön?

Verfasst: 12. November 2008 09:39
von surfman19
mit SetEvent, ResetEvent aus der Winapi würde das funktionieren?

bye

Verfasst: 12. November 2008 09:46
von pfid
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?

Verfasst: 12. November 2008 09:50
von surfman19
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...

Verfasst: 12. November 2008 10:24
von pfid
Dann kannst du die Callbackfunktion das Ergebnis ja in der Threadklasse speichern lassen, und der Thread prüft vor dem wait das Ergebnis.