Windows Messages auswerten(Thread)
-
- Beiträge: 565
- Registriert: So 26. Aug 2012, 09:03
- OS, Lazarus, FPC: Windows(10), Linux(Arch)
- CPU-Target: 64Bit
Windows Messages auswerten(Thread)
Liebes Forum,
mein Programm benötigt einen Thread, der mit dem Hauptthread(GUI) kommuniziert.
Ich wollte die Kommunikation mithilfe von Winmessages lösen, die dann einfach an den Threadhandler gesendet werden.
Leider finde ich nirgends eine Methode wie GetMessage/WaitForMessage(handle,[...]); oder so, mit der man dann alle ankommenden Messages auswerten kann.
Hat irgendwer ein funktionierendes Beispiel(eine einfache Schleife, die die Nachrichten auswertet).
Allgemeiner gefragt:
Wie löst man am besten eine solche Kommunikation?
MFG
Komoluna
mein Programm benötigt einen Thread, der mit dem Hauptthread(GUI) kommuniziert.
Ich wollte die Kommunikation mithilfe von Winmessages lösen, die dann einfach an den Threadhandler gesendet werden.
Leider finde ich nirgends eine Methode wie GetMessage/WaitForMessage(handle,[...]); oder so, mit der man dann alle ankommenden Messages auswerten kann.
Hat irgendwer ein funktionierendes Beispiel(eine einfache Schleife, die die Nachrichten auswertet).
Allgemeiner gefragt:
Wie löst man am besten eine solche Kommunikation?
MFG
Komoluna
Programmer: A device to convert coffee into software.
Rekursion: siehe Rekursion.
Rekursion: siehe Rekursion.
-
- Beiträge: 340
- Registriert: Di 12. Sep 2006, 08:57
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Kontaktdaten:
Re: Windows Messages auswerten(Thread)
Ich mache das mit der Unit simpleipc und dem TSimpleIPCServer.
Grüße, Antrepolit
care only if your os is really burning
care only if your os is really burning
-
- Beiträge: 565
- Registriert: So 26. Aug 2012, 09:03
- OS, Lazarus, FPC: Windows(10), Linux(Arch)
- CPU-Target: 64Bit
Re: Windows Messages auswerten(Thread)
wie geht das denn?
Hast du ein minbsp/gutes Tutorial?
MFG
Komoluna
Hast du ein minbsp/gutes Tutorial?
MFG
Komoluna
Programmer: A device to convert coffee into software.
Rekursion: siehe Rekursion.
Rekursion: siehe Rekursion.
Re: Windows Messages auswerten(Thread)
Hallo Komoluna,
ich hätte ein mini Beispiel, da ich das selbst vor wenigen Tagen ausprobiert habe, allerdings
zwischen zwei Prozessen. Geht sicher innerhalb eines Prozess genauso.
Kann ich ein zip hier irgendwie anhängen - wie tauscht man solche mini examples hier am besten aus ?
Ansonsten gerne auch per PN.
Sind nur 20kB, aber hier ins Textfenster posten wird auch unübersichtlich.
SimpleIPC scheint sehr gut zu gehen, bei mir unter linux und win32 ohne Probleme.
Ein alternative wäre vielleicht ein TEventObject ? Das nutze ich bei einem meiner Projekte.
Prinzip: Ich rufe von Thread A eine Methode in Thread B auf, z.B. SetMyEvent.
Dort kann man auch ein Record oder sonst irgendwas einfach übergeben, was mit einem
SendMessage evtl. schwieriger wird.
Methode in Thread B setzt ein dann TEvent auf welches die execute Methode wartet.
Funktioniert auch sehr zuverlässig unter linux und win.
Allerdings habe ich ebenso gute Erfahrungen mit Sendmessage bzw. Postmessage gemacht,
nur noch nicht zwischen Threads in verschiedenen dlls, da kann ich nicht sicher sagen ob das geht.
Unter win32 geht das sowieso und bei mir unter linux mindestens seit Lazarus 0.9.28 auch wunderbar.
Grüße, Stefan
ich hätte ein mini Beispiel, da ich das selbst vor wenigen Tagen ausprobiert habe, allerdings
zwischen zwei Prozessen. Geht sicher innerhalb eines Prozess genauso.
Kann ich ein zip hier irgendwie anhängen - wie tauscht man solche mini examples hier am besten aus ?
Ansonsten gerne auch per PN.
Sind nur 20kB, aber hier ins Textfenster posten wird auch unübersichtlich.
SimpleIPC scheint sehr gut zu gehen, bei mir unter linux und win32 ohne Probleme.
Ein alternative wäre vielleicht ein TEventObject ? Das nutze ich bei einem meiner Projekte.
Prinzip: Ich rufe von Thread A eine Methode in Thread B auf, z.B. SetMyEvent.
Dort kann man auch ein Record oder sonst irgendwas einfach übergeben, was mit einem
SendMessage evtl. schwieriger wird.
Methode in Thread B setzt ein dann TEvent auf welches die execute Methode wartet.
Funktioniert auch sehr zuverlässig unter linux und win.
Allerdings habe ich ebenso gute Erfahrungen mit Sendmessage bzw. Postmessage gemacht,
nur noch nicht zwischen Threads in verschiedenen dlls, da kann ich nicht sicher sagen ob das geht.
Unter win32 geht das sowieso und bei mir unter linux mindestens seit Lazarus 0.9.28 auch wunderbar.
Grüße, Stefan
-
- Beiträge: 565
- Registriert: So 26. Aug 2012, 09:03
- OS, Lazarus, FPC: Windows(10), Linux(Arch)
- CPU-Target: 64Bit
Re: Windows Messages auswerten(Thread)
hallo magnetron,
danke für die Tipps/das Angebot, Dateianhänge kannst du in jedem Post einfügen:
Unter dem Absenden Button an der linken seit sind 2 Reiter, Optionen und Dateianhang hochladen.
MFG
Komoluna
danke für die Tipps/das Angebot, Dateianhänge kannst du in jedem Post einfügen:
Unter dem Absenden Button an der linken seit sind 2 Reiter, Optionen und Dateianhang hochladen.
MFG
Komoluna
Programmer: A device to convert coffee into software.
Rekursion: siehe Rekursion.
Rekursion: siehe Rekursion.
Re: Windows Messages auswerten(Thread)
Ahh, ok gesehen.
Anbei winziger testclient und testserver - wie gesagt, das simpleipc
funktioniert meines erachtens einwandfrei.
Die Frage die ich nicht beantworten kann ist, was performanter ist...
TEventObject, Postmessage oder der SimpleIPC... naja hauptsache es läuft
Achso, bei produktivem Einsatz sollte man vor dem (jedem) Datenbaustausch abfragen ob der Server läuft
etc. ansonsten crasht das programm eventuell.
Grüße, Stefan
Anbei winziger testclient und testserver - wie gesagt, das simpleipc
funktioniert meines erachtens einwandfrei.
Die Frage die ich nicht beantworten kann ist, was performanter ist...
TEventObject, Postmessage oder der SimpleIPC... naja hauptsache es läuft

Achso, bei produktivem Einsatz sollte man vor dem (jedem) Datenbaustausch abfragen ob der Server läuft
etc. ansonsten crasht das programm eventuell.
Grüße, Stefan
- Dateianhänge
-
simpleipc_minitest_server.zip
- simpleipc test server
- (3.14 KiB) 88-mal heruntergeladen
-
simpleipc_minitest_client.zip
- simpleipc test client
- (2.94 KiB) 89-mal heruntergeladen
-
- Beiträge: 565
- Registriert: So 26. Aug 2012, 09:03
- OS, Lazarus, FPC: Windows(10), Linux(Arch)
- CPU-Target: 64Bit
Re: Windows Messages auswerten(Thread)
Hallo Leute,
ich habe mich jetzt entschieden bei Winmsg zu bleiben.
Die funktion GetMessage hab ich in der Windows Unit gefunden.
@magnetron:
Du meintest, du hast PostMessage und Linux verwendet?
Wie liest du denn da die Messages aus?
Wenn sich GetMessage in der Unit Windows befindet geht das doch unter Linux nicht, oder?
Oder gibt es irgendwo ne Kapselroutine in der LCL dafür, die abhänging vom OS dann die nativen methoden aufruft?
MFG
Komoluna
ich habe mich jetzt entschieden bei Winmsg zu bleiben.
Die funktion GetMessage hab ich in der Windows Unit gefunden.
@magnetron:
Du meintest, du hast PostMessage und Linux verwendet?
Wie liest du denn da die Messages aus?
Wenn sich GetMessage in der Unit Windows befindet geht das doch unter Linux nicht, oder?
Oder gibt es irgendwo ne Kapselroutine in der LCL dafür, die abhänging vom OS dann die nativen methoden aufruft?
MFG
Komoluna
Programmer: A device to convert coffee into software.
Rekursion: siehe Rekursion.
Rekursion: siehe Rekursion.
Re: Windows Messages auswerten(Thread)
Guten Morgen Komoluna,
ich hoffe wir reden von den selben "messages", ich bin kein Profi, für windows schon gar nicht.
Ich habe (bevor ich nun das Konzept mit dem TEventObject nutze) die Kommunikation
mit Messages wiefolgt gemacht (geht unter win32 und unter linux ab Lazarus 0.9.30,
habe gerade gesehen dass ich bei 0.9.28 noch Probleme hatte).
Im Beispiel in eine Richtung, vom Thread zur main application.:
In der Thread unit und im main form unit LMessages aufnehmen,
benötigt kein windows, geht unter linux und windows:
im Thread Postmessage aufrufen:
Im main form kommt die message an, im message handler:
Das wars, geht super. Ansonsten siehe auch
http://lazarus-dev.blogspot.de/2008/01/ ... ssage.html
Geht vermutlich nur für LCL Programme und ist - obwohl plattformübergreifend
implementiert - recht windows lastig.
Viel Erfolg, Stefan
ich hoffe wir reden von den selben "messages", ich bin kein Profi, für windows schon gar nicht.
Ich habe (bevor ich nun das Konzept mit dem TEventObject nutze) die Kommunikation
mit Messages wiefolgt gemacht (geht unter win32 und unter linux ab Lazarus 0.9.30,
habe gerade gesehen dass ich bei 0.9.28 noch Probleme hatte).
Im Beispiel in eine Richtung, vom Thread zur main application.:
In der Thread unit und im main form unit LMessages aufnehmen,
benötigt kein windows, geht unter linux und windows:
Code: Alles auswählen
uses
LMessages
Code: Alles auswählen
PostMessage(frm_Analyzer.Handle, LM_USER+1, PtrInt(FMessage.wParam), PtrInt(FMessage.lParam));
Code: Alles auswählen
procedure OnChannelMSG(var AMessage: TMsg); message LM_USER+1;
http://lazarus-dev.blogspot.de/2008/01/ ... ssage.html
Geht vermutlich nur für LCL Programme und ist - obwohl plattformübergreifend
implementiert - recht windows lastig.
Viel Erfolg, Stefan
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Windows Messages auswerten(Thread)
Warum ?Komoluna hat geschrieben:Ich wollte die Kommunikation mithilfe von Winmessages lösen, die dann einfach an den Threadhandler gesendet werden.
- Der GUI Thread darf natürlich nicht warten, sondern muss ein Callback-Event ausführen
- Andere Threads dürfen auf die Events warten.
"Message" an den GUI-Thread kannst Du mit QueueAsyncCall schicken.
Ein Worker-Thread kann mit TEvent.Waitfor auf eine "Message" warten und sie dann bearbeiten wenn ein anderer Thread das Event auslöst.
Ich habe vor kurzem eine "ThreadPool" Unit geschrieben, bei der eine Anzahl Workerthreads auf Arbeit warten, die ihnen der Mainthread zuteilt und die sich dann mit einem Callback-Event beim Mainthread zurückmelden, wenn die Arbeit getan ist. Dazu braucht man keinen Windows-Spezifischen Kram wie "Messages".
Michael