CreateEvent und CreateThread



  • Hallo,

    kann mir jemand erklären wie die CreateEvent und die CreateThread Methode Funktionieren? Wichtig wäre auch wie die Übergabe Parameter zu interpretieren sind.
    Also ich habe folgenden Code aus einer Beispieldatei:

    var = CreateEvent(NULL, false, false, 0);
    

    Bei msdn steht folgendes:
    "Erstellt einen neuen Ereignisdeskriptor, der mit einem vorhandenen Ereignisdeskriptor identisch ist, indem die Deskriptorinformationen aus einem angegebenen Ereignis für einen Typ dynamisch generiert werden."
    "CreateEvent(Type, String, Type, array<Attribute>[]()[])"

    Damit kann ich allerdings nicht so viel anfangen, da ich eher Anfänger im Bereich C++ bin.
    Ich habe natürlich auch so schon einige Versuche über google etwas zu finden hinter mir und 4 verschiedene Bücher habe ich auch schon durchsucht, ohne Erfolg.

    Über eine Antwort würde ich mich sehr freuen.
    Vielen Dank
    laura



  • http://msdn.microsoft.com/en-us/library/ms682396(VS.85).aspx

    Das erste Ergebnis von Google für CreateEvent.



  • Okay, danke schonmal für die Antwort, manchmal sieht man eben den Wald vor lauter Bäumen nicht mehr.

    Nachdem ich mich da jetzt durchgearbeitet habe bin ich zwar schon etwas schlauer, aber eben noch nicht ganz, wie gesagt ich bin Anfänger und ziemlich ins kalte Wasser geschubst worden.

    Also ich erschaffe mit CreateEvent ein Event Objekt, aber was macht dieses Objekt denn jetzt eigentlich? Die Parameter habe ich so verstanden dass der erste ein Zeiger auf ein Sicherheitsattribut ist, der zweite den Zustand des Objekts zurücksetzt ob jetzt manuell oder automatisch auf nicht alarmiert (was auch immer das bedeuten soll), der dritte den Grundzustand des Objekts festlegt und der vierte einfach nur der Name ist. Da ich aber noch nicht so richtig verstehe was man mit diesem Event bezweckt, kann ich auch nicht verstehen wann der Zustand zurück gesetzt wird.

    Ich hab das so verstanden dass man das Event in ein handle schreibt, zumindest wird das in meinem Quellcode so gemacht, und irgendwann wird das Event dann mit SetEvent aufgerufen. Ich finde halt nirgends eine Funktion die dann irgend etwas auslöst.

    Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt. Ich weiß, das sind vielleicht Sachen die sollte man wissen, aber vielleicht hilft ja auch jemand einem totalen Anfänger. Vielen Dank schonmal.



  • Hallo,

    es geht um Threads und deren Synchronisation. Es gibt ein Beispiel für ein erstes Verständnis hier:

    http://msdn.microsoft.com/en-us/library/ms686915(VS.85).aspx

    MfG,

    Probe-Nutzer



  • Danke für den Link, ich habe das Beispiel auch gleich mal durchgearbeitet und auch ausprobiert. Jetzt ist mir schon wieder so einiges klarer. Allerdings ein, zwei Fragen hätte ich da schon noch.

    Woran liegt es denn zum Beispiel dass wenn ich den Code so ausführe ich immer wieder eine andere Ausgabe bekomme? Also die Reihenfolge ist zwar grob geordnet hat aber immer irgendwelche Abwandlungen aufzubieten.

    Außerdem treten sehr oft Fehler bei der Ausgabe auf, hauptsächlich irgendwelche Schreibfehler. Das darf doch eigentlich auch nicht passieren, oder. Ich habe den Code auch nicht abgeändert, nur ein system("pause"); eingefügt damit ich mir die Ausgabe besser anschauen kann.

    Ansonsten wüsste ich gerne noch was es bedeutet wenn ein Thread "signaled" ist und was "starting adress for a thread" bedeuten soll (wird von der ThreadProc Funktion geliefert). Also ich kann es auf deutsch übersetzten aber das hilft mir auch nicht. 😉

    Vielen Dank für eure Hilfe!



  • laura84 schrieb:

    Woran liegt es denn zum Beispiel dass wenn ich den Code so ausführe ich immer wieder eine andere Ausgabe bekomme? Also die Reihenfolge ist zwar grob geordnet hat aber immer irgendwelche Abwandlungen aufzubieten.

    Das ist in Multi-Thread-Umgebungen normal, du kannst i.A. nicht vorhersagen, welcher Thread wann Prozessorzeit zugeteilt bekommt und deswegen gerade läuft. Threads sollen ja oft gerade unabhängig voneinander ihre Aufgabe erfüllen, damit keine unnötigen Wartezeiten entstehen, und wenn es doch Abhängigkeiten gibt, dann hat man die Synchronisationsmittel wie z.B. Event-Objekte.

    laura84 schrieb:

    Außerdem treten sehr oft Fehler bei der Ausgabe auf, hauptsächlich irgendwelche Schreibfehler. Das darf doch eigentlich auch nicht passieren, oder. Ich habe den Code auch nicht abgeändert, nur ein system("pause"); eingefügt damit ich mir die Ausgabe besser anschauen kann.

    Wenn du dir die Ausgabe ansehen willst, kannst du auch mit

    programm.exe > ausgabe.txt

    sonst sichtbare Textausgaben in eine Datei (hier mit dem Namen ausgabe.txt) umleiten, oder den Zeichenpuffer der Eingabeaufforderung erhöhen, wenn du das Beispiel daraus gestartet hast, dann benötigst du auch kein Pausieren.

    Zum Signal-/Ereigniskonzept steht hier:

    http://www.nt.fh-koeln.de/fachgebiete/inf/diplom/proc_sync/3/3.6.html

    etwas. Übersetze dort "Anfrage" am besten mit "Thread hat Wartefunktion aufgerufen und wartet darauf, dass das Event-Objekt den Zustand 'signalisierend' erreicht".

    "starting adress for a thread" ist nur eine andere Bezeichnung dafür, dass du ja bei CreateThread eine Funktion übergeben musst, genauer, einen Funktionszeiger, und so ein Zeiger steht bzw. verweist auf die Startadresse der Funktion (der ThreadProc), ab dieser Adresse beginnen die Anweisungen, die der Thread ausführen soll.

    MfG,

    Probe-Nutzer



  • Hallo Probe-Nutzer,

    vielen Dank für deine Hilfe, jetzt habe ich es endlich verstanden.

    Gruß
    Laura


Log in to reply