Gelöst: Pipe blockiert alle Threads

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
braunbär
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

Beitrag von braunbär »

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.

Benutzeravatar
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

Beitrag von af0815 »

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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

braunbär
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

Beitrag von braunbär »

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).
Dateianhänge
Pipetest.zip
(139.83 KiB) 51-mal heruntergeladen

Benutzeravatar
theo
Beiträge: 10920
Registriert: Mo 11. Sep 2006, 19:01

Re: Pipe blockiert alle Threads

Beitrag von theo »

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.

braunbär
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

Beitrag von braunbär »

Ok, verstehe... danke fürs erste. Ich hoffe, das war der Grund.

braunbär
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

Beitrag von braunbär »

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

Benutzeravatar
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

Beitrag von Jorg3000 »

Hi!
Im Click bitte nicht PT.execute; aufrufen, weil der Thread bereits durch create(false, ...) gestartet wurde.

Benutzeravatar
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

Beitrag von Jorg3000 »

Und um auf ein Fenster mittels Synchronize() zuzugreifen ...

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;
Die Funktion Fehler() müsste entsprechend behandelt werden.
Grüße, Jörg

braunbär
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

Beitrag von braunbär »

Jorg3000 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.
Leider ändert das nichts an der Blockierung,. Den Zugriff auf die UI in Fehler und Debug habe ich auch schon entfernt

Benutzeravatar
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

Beitrag von af0815 »

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

braunbär
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

Beitrag von braunbär »

Danke, das klingt sehr gut.
Ich habe einen lange geplanten und wohlverdienten :D 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

braunbär
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

Beitrag von braunbär »

af0815 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.
Danke, jetzt läuft mein Programm auch

Antworten