C# +Nachrichtenschleife



  • Hallo,

    ich würde gerne einer Klasse in C# eine Nachrichtenschleife verpassen.
    Kann ich das machen, ohne von Form ableiten zu müssen ??

    Also lediglich eine Nachrichtenschleife implementieren.

    Ich würde gerne für Timer Prioritäten zulassen, um das System skalierbar zu halten. Leider sind die Klassen keine Windows, sondern eine ebene darunter.

    Grüße


  • Administrator

    AlexanderKiebler schrieb:

    Ich würde gerne für Timer Prioritäten zulassen, um das System skalierbar zu halten. Leider sind die Klassen keine Windows, sondern eine ebene darunter.

    Den Satz verstehe ich nicht ganz. Erläutere dein Problem bitte genauer.

    Du kannst schon eine Nachrichtenschleife starten ohne Form allerdings nur pro Thread. Siehe dir dazu STAThreadAttribute und Application.Run an.

    Grüssli



  • Hmm

    Okay, das Problem ist Folgendes.

    Ich habe einen Form Timer, welchen ich erfolgreich starten und stoppen kann.
    Sobalt ich ihn aber neu starten möchte, geht das nicht mehr.

    Mir wurde gesagt, dass das ein Problem der Nachrichtenschleife wäre.

    Ich bin dann zu den System.Timers übergegangen.
    Da ich die Timer zum abtasten eines Signals nehme, ist das aber keine gute Lösung,
    da sie "aussetzer" haben, also sich nicht priorisieren lassen soweit ich das bis jetzt überschaue.

    Ich rechne mit einer Hohen Priorität von Bildschirmausgabe Prozessen/Threads und einer niedrigen für console....

    Also ich bin bezüglich C# sehr neu... mir fehlt die Erfahrung über die KLassen in C#....

    Bezüglich WIndwos Programmierung kann ich mir dann merken, eine Nachrichtenschleife: "NS" pro Prozess, also ist auch in jedem Thread des Prozesses "NS" die Selbe.



  • Bezüglich WIndwos Programmierung kann ich mir dann merken, eine Nachrichtenschleife: "NS" pro Prozess, also ist auch in jedem Thread des Prozesses "NS" die Selbe.

    Das ist falsch. Message Loops sind pro Thread und es kann durchaus mehrere pro Prozess haben.

    Edit:
    Ich würde den Timer aus System::Threading einsetzen - der ist unabhängig vom Message Loop und läuft einen eigenen Thread (aus dem Thread Pool).
    Um mit dem Gui zu interagieren benutzt du die Invoke(..) Methoden deines Controls. Gui Elemente dürfen nur über den Thread zugergriffen werden, auf dem sie erzeugt worden sind, desshalb das Invoke(..).



  • Okay, das würde eher zum Verhalten meines Programms passen.
    Wo gibt es denn eine gute Doku über die Benachrichtigungsschleife ??



  • AlexanderKiebler schrieb:

    Wo kann ich denn eine gute doku über die Nachrichtenschleife finden ??

    http://msdn.microsoft.com/en-us/library/ms644928(v=vs.85).aspx
    Und natürlich im Windows Advanced Buch von Jeffrey Richter.



  • Hi Theta,

    danke für die klasse Hilfe.
    Die Funktionsweise von Invoke ist mir klar geworden.

    Was mich wundert is aber, dass man es bei threads braucht.
    Ich hätte erwartet, das man sowas nur bei Funktionspointern braucht, die nicht im selben Prozess sind. Also um die Funktionspointer in shared mem ab zu legen oder sowas....

    Oder sorgt es für die Tread sicherheit, also automatisches Mutexen ???



  • Okay, erst lesen, dann schreiben.. Sory.. 🙂


Anmelden zum Antworten