Windows Messages auswerten(Thread)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Windows Messages auswerten(Thread)

Beitrag von Komoluna »

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
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Antrepolit
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)

Beitrag von Antrepolit »

Ich mache das mit der Unit simpleipc und dem TSimpleIPCServer.
Grüße, Antrepolit

care only if your os is really burning

Komoluna
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)

Beitrag von Komoluna »

wie geht das denn?
Hast du ein minbsp/gutes Tutorial?

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

magnetron
Beiträge: 44
Registriert: Di 4. Nov 2014, 14:04

Re: Windows Messages auswerten(Thread)

Beitrag von magnetron »

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

Komoluna
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)

Beitrag von Komoluna »

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
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

magnetron
Beiträge: 44
Registriert: Di 4. Nov 2014, 14:04

Re: Windows Messages auswerten(Thread)

Beitrag von magnetron »

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
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

Komoluna
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)

Beitrag von Komoluna »

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
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

magnetron
Beiträge: 44
Registriert: Di 4. Nov 2014, 14:04

Re: Windows Messages auswerten(Thread)

Beitrag von magnetron »

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:

Code: Alles auswählen

uses
 LMessages
im Thread Postmessage aufrufen:

Code: Alles auswählen

  PostMessage(frm_Analyzer.Handle, LM_USER+1, PtrInt(FMessage.wParam), PtrInt(FMessage.lParam));  
Im main form kommt die message an, im message handler:

Code: Alles auswählen

procedure OnChannelMSG(var AMessage: TMsg); message LM_USER+1; 
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

mschnell
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)

Beitrag von mschnell »

Komoluna hat geschrieben:Ich wollte die Kommunikation mithilfe von Winmessages lösen, die dann einfach an den Threadhandler gesendet werden.
Warum ?

- 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

Antworten