Suche Hilfe bei der prinzipiellen Vorgehensweise von "CreateEvent"

Ulrich Michalik

Grünschnabel
Ich habe Verständnisprobleme bei einem bestehenden Code der CreateEvent benutzt.

Ich habe diese Form der implementierung noch nicht kennengelernt.
Kann mir jemand die grundlegenden Vorgehensweisen erklären

Wie melde ich dieses Event an und wo stelle ich die entsprechende Callbackfunktion bereit die beim Emfpang des Events aufgerufen werden soll.

wie funktioniert das Zusammenspiel mit den Threads
 
Das Event ist eigentlich nur eine Art Flag, die im Raum steht.

Die entsprechende Abfrageroutinge wäre WaitForSingleObject oder WaitForMultipleObjects. Dort kann man eins oder mehrere Events abfragen. Die Routine blockiert dann solange, bis eins der Events dann mit SetEvent gesetzt wurde (oder der vorgegebene Timeout abgelaufen ist). Das ist praktisch, um einen schlafenden Thread aufzuwecken, der dann je nach Flag etwas erledigt.
 
Hallo,

ich habe ein Problem zu Threads

/******************************************************************************
HANDLE hCompleted = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!hCompleted)
{
// The event was not created. Handle the error.
}
IMpeg2Stream *pStream = 0;

//The GetStreamOfSections method returns immediately, and the caller provides
//an event which is signaled whenever new data arrives.

hr = pMPEG->GetStreamOfSections(pid, tid, NULL, hCompleted, &pStream);

/******************************************************************************

Versteh ich das richtig?

Die Funktion GetStreamOfSections setzt jedes mal wenn Daten gefiltert werden das Event hCompleted.

kann ich nun einen Thread erzeugen, der mit WaitForSingleObject wartet, bis das Event
hCompleted gesetzt wurde und dann meine Thread-Funkton ausführt?

Startet der Thread anschließend automatisch neu und wartet wieder bis das Event gesetzt wird?

ein Beispiel zu Events und Threads würde mir schon sehr weiterhelfen. Ich finde aber leider nur immer Beispiele bei denen ein Thread wartet, bis ein anderer beendet wurde und das hilft mir nicht weiter.

Danke!
 
Die WaitForSingleObject-Funktion wartet, bis das eine Event eingetreten ist. Danach musst du das erneut aufrufen. Solche Arbeiterthreads werden dann üblicherweise mit einer Quasi-Endlos-Schleife bestückt, damit die immer wieder warten. In dem Fall benötigt der Thread allerdings auch noch eine Möglichkeit, beendet zu werden (sinnvollerweise auch ein Event).

Da greift man dann besser zu WaitForMultipleObjects und hängt ausser dem gewünschten Event noch ein Runter-Fahr-Event dazu.
 
Vielen Dank für deine Antwort.

Da war die Lösung doch naheliegender als ich mir gedacht habe.

Danke!
 
Zurück