Gelöst: Pipe blockiert alle Threads
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Gelöst: Pipe blockiert alle Threads
Ich habe in einem Thread eine blockierenden Pipe. Sobald ich in dem Thread waitforconnection aufrufe, ist nicht nur dieser Thread blockiert, wie ich es erwartet habe, sondern das ganze Programm friert komplett ein. Jetzt frage ich mich, ob das normal ist, denn mMn kann das nicht so designt worden sein. Das führt doch die ganz Idee der Threads ad absurdum
Zuletzt geändert von braunbär am Mi 29. Jan 2025, 19:49, insgesamt 1-mal geändert.
- af0815
- Lazarusforum e. V.
- Beiträge: 6848
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Pipe blockiert alle Threads
Ohne Code bleibt die Glaskugel dunkel.
Wenn im Thread sowas blockiert, muss es irgendwie eine Verknüpfung nach außen geben, sonst würde der Thread nicht alles lahmlegen. Oder du greifst von aussen auf den geblockten Thread zu. Beispiel zum Anzeigen von Status Meldungen, dann schleppt du dir das Problem ins UI.
Wenn im Thread sowas blockiert, muss es irgendwie eine Verknüpfung nach außen geben, sonst würde der Thread nicht alles lahmlegen. Oder du greifst von aussen auf den geblockten Thread zu. Beispiel zum Anzeigen von Status Meldungen, dann schleppt du dir das Problem ins UI.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Re: Pipe blockiert alle Threads
Ich habe jetzt ein Minimalprojekt angelegt, umd das Problem nachvollziehbar zu machen.
Wenn das Programm gestartet wird, ist noch alles ganz normal. In das TEdit kann man Daten eingeben, und die Form kann man am Bildschirm verschieben.
Mit dem Button Start wird ein Thread erstellt, in dem eine Pipe angelegt wird und der dann auf eine Verbindung zu einem Client wartet, und der Thread wird gestartet. Sobald im Thread auf die Verbindung gewartet wird, ist auch das Hauptformular blockiert, man kann es am Bildschirm nicht verschieben und in edit-Feld keine Daten eingeben.
Sobald irgend ein anderes Programm die Pipe öffnet, wird die Blockierung aufgehoben, das Hauptformular reagiert wieder auf Eingaben und lässt sich wieder am Bildschirm bewegen (bei mir ist das Gegenstück in Turbo-Pascal auf MsDos geschrieben, das lasse ich hier weg, weil es geht um die Blockierung, solange sich kein anderes Programm bei der Pipe anmeldet).
Wenn das Programm gestartet wird, ist noch alles ganz normal. In das TEdit kann man Daten eingeben, und die Form kann man am Bildschirm verschieben.
Mit dem Button Start wird ein Thread erstellt, in dem eine Pipe angelegt wird und der dann auf eine Verbindung zu einem Client wartet, und der Thread wird gestartet. Sobald im Thread auf die Verbindung gewartet wird, ist auch das Hauptformular blockiert, man kann es am Bildschirm nicht verschieben und in edit-Feld keine Daten eingeben.
Sobald irgend ein anderes Programm die Pipe öffnet, wird die Blockierung aufgehoben, das Hauptformular reagiert wieder auf Eingaben und lässt sich wieder am Bildschirm bewegen (bei mir ist das Gegenstück in Turbo-Pascal auf MsDos geschrieben, das lasse ich hier weg, weil es geht um die Blockierung, solange sich kein anderes Programm bei der Pipe anmeldet).
- Dateianhänge
-
Pipetest.zip
- (139.83 KiB) 51-mal heruntergeladen
Re: Pipe blockiert alle Threads
Hab's nur kurz durchgekuckt, nicht ausprobiert.
Was mal sicher falsch ist, ist deine Debug Prozedur.
Du kannst nicht aus dem PipeThread unsynchronisiert auf das Formular zugreifen (Haupttread).
Benutze Synchronize.
Siehe hier:
https://wiki.lazarus.freepascal.org/Mul ... read_Class
Ob das dein Problem löst, kann ich nicht sagen.
Was mal sicher falsch ist, ist deine Debug Prozedur.
Du kannst nicht aus dem PipeThread unsynchronisiert auf das Formular zugreifen (Haupttread).
Benutze Synchronize.
Siehe hier:
https://wiki.lazarus.freepascal.org/Mul ... read_Class
Ob das dein Problem löst, kann ich nicht sagen.
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Re: Pipe blockiert alle Threads
Ok, verstehe... danke fürs erste. Ich hoffe, das war der Grund.
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Re: Pipe blockiert alle Threads
Leider ist das nicht die Ursache.
Ich habe auf die Schnelle den Zugriff auf die Listbox in Debug und das Showmessage in Fehler auskommentiert. Jetzt erfolgt aus dem Thread heraus kein Zugriff auf das UI mehr, Es friert aber trotzdem die Form1 ein, sobald ich "Start" anklicke...
Ich habe auf die Schnelle den Zugriff auf die Listbox in Debug und das Showmessage in Fehler auskommentiert. Jetzt erfolgt aus dem Thread heraus kein Zugriff auf das UI mehr, Es friert aber trotzdem die Form1 ein, sobald ich "Start" anklicke...
- Jorg3000
- Lazarusforum e. V.
- Beiträge: 385
- Registriert: So 10. Okt 2021, 10:24
- OS, Lazarus, FPC: Win64
- Wohnort: NRW
Re: Pipe blockiert alle Threads
Hi!
Im Click bitte nicht PT.execute; aufrufen, weil der Thread bereits durch create(false, ...) gestartet wurde.
Im Click bitte nicht PT.execute; aufrufen, weil der Thread bereits durch create(false, ...) gestartet wurde.
- Jorg3000
- Lazarusforum e. V.
- Beiträge: 385
- Registriert: So 10. Okt 2021, 10:24
- OS, Lazarus, FPC: Win64
- Wohnort: NRW
Re: Pipe blockiert alle Threads
Und um auf ein Fenster mittels Synchronize() zuzugreifen ...
Die Funktion Fehler() müsste entsprechend behandelt werden.
Grüße, Jörg
Code: Alles auswählen
TPipeThread = class(TThread)
private
hPipe: THandle;
FDebugMessage: String; // neu
procedure DoDebug; // neu
protected
...
procedure TPipeThread.DoDebug; // diese Funktion läuft synchronisiert und darf auf Forms zugreifen
begin
Form1.ListBox1.Items.Add(FDebugMessage);
end;
procedure TPipeThread.Debug(const s: string);
begin
FDebugMessage := s; // String zwischenspeichern weil kein Übergabeparameter erlaubt
Synchronize(@DoDebug);
end;
Grüße, Jörg
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Re: Pipe blockiert alle Threads
Leider ändert das nichts an der Blockierung,. Den Zugriff auf die UI in Fehler und Debug habe ich auch schon entferntJorg3000 hat geschrieben: So 26. Jan 2025, 14:16 Hi!
Im Click bitte nicht PT.execute; aufrufen, weil der Thread bereits durch create(false, ...) gestartet wurde.
- af0815
- Lazarusforum e. V.
- Beiträge: 6848
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Pipe blockiert alle Threads
Wenn ich in Debug und Fehler einfach die Augabe an den LazLogger ausgebe und im Formreate einmal eine LazLoggerausgabe mache. Zusätzlich das pt.execute ausnehme, so läuft die App wie geplant. Ich kann mit einem weiteren Button Einträge in die Listbox machen. Also die UI ist nicht mehr blockiert. Der Thread selbst ist natürlich voll geblockt, weil die Pipe bei mir keine Verbindung bekommt. Aber das ist ja per Design.
- Dateianhänge
-
PipetestOk.zip
- (140.16 KiB) 40-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
Re: Pipe blockiert alle Threads
Danke, das klingt sehr gut.
Ich habe einen lange geplanten und wohlverdienten
Kurzurlaub bis Mittwoch eingelegt, wenn ich zurück bin schau ich mir die Unterschiede zu meinem Programm an und bringe das meinige dann hoffentlich zum Laufen
Ich habe einen lange geplanten und wohlverdienten

-
- Beiträge: 463
- Registriert: Do 8. Jun 2017, 18:21
- OS, Lazarus, FPC: Windows 10 64bit, Lazarus 3.6, FPC 3.2.2
- CPU-Target: 64Bit
- Wohnort: Wien
[Gelöst] Re: Pipe blockiert alle Threads
Danke, jetzt läuft mein Programm auchaf0815 hat geschrieben: Mo 27. Jan 2025, 11:25 Wenn ich in Debug und Fehler einfach die Augabe an den LazLogger ausgebe und im Formreate einmal eine LazLoggerausgabe mache. Zusätzlich das pt.execute ausnehme, so läuft die App wie geplant. Ich kann mit einem weiteren Button Einträge in die Listbox machen. Also die UI ist nicht mehr blockiert. Der Thread selbst ist natürlich voll geblockt, weil die Pipe bei mir keine Verbindung bekommt. Aber das ist ja per Design.