MSG struct *verwirrung*



  • Hallo,

    meine Wenigkeit hatte soeben ernsthaften Kontakt mit der MSG struct.
    Nur irgendwie schaffe ich es in meiner MSDN Suche immer in eine Endlosschleife zu geraten. Ich möchte Nachrichten in Form eines Strings von Thread A-> Nach B senden.
    Hier zu habe ich mich jetzt mal die Funktionen GetMessage() PeekMessage() angeschaut. Das Prinzip dieser ist mir nun auch klar. Nur,... Ich hab keine Ahnung
    wie ich ein MSG konformes Paket um meinen String packe,... geschweige denn wie ich es auch wieder auspacke. Zumal mir mein Builder bei den Werten lParam und wParam sowie message der MSG struct primitive typen wie int/long etc. im Editor anzeigt.
    Mir die MSDN allerdings sagt.

    UINT message;
    WPARAM wParam;
    LPARAM lParam;

    Aber nach diesen 3 Typen in der MSDN suchen führt nicht gerade zu einem Ergebniss. 🙄



  • SendMessage



  • Slashi schrieb:

    Zumal mir mein Builder bei den Werten lParam und wParam sowie message der MSG struct primitive typen wie int/long etc. im Editor anzeigt.
    Mir die MSDN allerdings sagt.

    UINT message;
    WPARAM wParam;
    LPARAM lParam;

    Aber nach diesen 3 Typen in der MSDN suchen führt nicht gerade zu einem Ergebniss. 🙄

    Guten Morgen

    steht in irgend einer Header weiss jetzt aber leider nicht in welcher.

    typedef LONG LRESULT;
    typedef unsigned int UINT;
    typedef WORD WPARAM;
    typedef DWORD LPARAM;
    

    MFG PinguGroup



  • Die Message-Structs sind festgelegt, Du kannst da nicht einfach irgendwelche Strings reinpacken. Welche DAten Du der Message mitgibst, hängt von der Message selbst ab. Die Daten werden dann in wParam und lParam übergeben.
    Du kannst natürlich eigene Messages kreieren (z. B. WM_APP + 1 oder WM_USER + 1) und in den Params dann Pointer übergeben, die aber entsprechend beim Senden und Empfangen gecastet werden müssen.



  • Also eine eigene Struct hatte ich natürlich nicht vor zu erstellen.

    Ich habe bereits ein Paket an Daten die ich versenden möchte. Bzw sauber von
    Thread A & B nach Thread C bekomme. Das versenden der Nachrichten sowie das Abrufen,
    klappt soweit auch (mit leeren Nachrichten) Die Frage ist jetzt wie packe ich mein
    Paket die MSG struct. (Wobei ich mir nach weiterem ge-google nicht mehr sicher bin
    das es so geht... 😕 )

    Nur egal wie ich über suche... zu 99% werden "Tasten" auf diese Weise versendet.
    Des weiteren schien es mir so als würde ich nur 64Bit je PostThreadMessage()
    übermitteln können!? Stimmt das? Habe ich überhaupt Möglichkeiten Strings auf diese
    Weise zu übermitteln?



  • Einfach einen Zeiger auf den String versenden



  • Slashi schrieb:

    Also eine eigene Struct hatte ich natürlich nicht vor zu erstellen.

    Ich habe bereits ein Paket an Daten die ich versenden möchte. Bzw sauber von
    Thread A & B nach Thread C bekomme. Das versenden der Nachrichten sowie das Abrufen,
    klappt soweit auch (mit leeren Nachrichten) Die Frage ist jetzt wie packe ich mein
    Paket die MSG struct. (Wobei ich mir nach weiterem ge-google nicht mehr sicher bin
    das es so geht... 😕 )

    Nur egal wie ich über suche... zu 99% werden "Tasten" auf diese Weise versendet.
    Des weiteren schien es mir so als würde ich nur 64Bit je PostThreadMessage()
    übermitteln können!? Stimmt das? Habe ich überhaupt Möglichkeiten Strings auf diese
    Weise zu übermitteln?

    Definitiv nicht, wie schon gesagt: Die Kapazität der Message ist festgelegt. Du kannst höchstens die Pointer auf Deine Strings zu lParam casten und so versenden.



  • Hmm verdammt.

    Also würde ich in den sendenden Threads (A&B) praktisch etwas in einen
    Container legen zum abholen und Thread C dann durch die Message sage: "so jetzt abholen"

    Nur habe ich dann das Problem das ich Zugriffsverletzungen erzeuge wenn Thread A oder B
    etwas in den Container legen und gleichzeitig Thread C versucht diesen abzuholen.
    Genau das wollte ich eigentlich damit verhindern. In dem ich einfach einen Manage Thread
    erstelle der die zu speichernden Daten als Message entgegen nimmt und dann im Stapel
    verarbeitet.

    Also werde ich wohl doch die Variabeln "sperren" müssen oder hat jemand einen
    anderen Lösungsvorschlag?


  • Mod

    Arbeite ohne Nachrichten.
    - Verwende eine critical section die eine Queue mit den Daten absicher.
    - Setze die Daten in die Queue.
    - Verwende ein Event, dass gesetzt wird wenn Daten in die Queue eingefügt wurden.


Anmelden zum Antworten