AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Verständnisfrage zur Thread-Synchronisation

Ein Thema von EdAdvokat · begonnen am 10. Apr 2022 · letzter Beitrag vom 22. Apr 2022
Antwort Antwort
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.643 Beiträge
 
#1

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 11. Apr 2022, 07:14
4. Eine Exception Behandlung muss im Execute erfolgen.
Oh, auch hier vielleicht wichtig als Hintergrundinfo: Ein "Feature" von Windows ist es, bei einer unbehandelten(!) Exception in einem Sub-Thread immer gleich den kompletten Prozess zu terminieren. Und zwar sofort. Throw -> alle Fenster weg. Du kannst in dem Moment nicht mehr reagieren. Noch nichtmal loggen. Deswegen ist es sauwichtig das jeder von Dir erzeugte Thread entweder ganz sicher keine Exception werfen kann oder idealerweise die komplette Ausführung in einer try/catch - Anweisung läuft. Sonst: Plopp
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.045 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 11. Apr 2022, 09:34
Oh, auch hier vielleicht wichtig als Hintergrundinfo: Ein "Feature" von Windows ist es, bei einer unbehandelten(!) Exception in einem Sub-Thread immer gleich den kompletten Prozess zu terminieren. Und zwar sofort. Throw -> alle Fenster weg. Du kannst in dem Moment nicht mehr reagieren. Noch nichtmal loggen. Deswegen ist es sauwichtig das jeder von Dir erzeugte Thread entweder ganz sicher keine Exception werfen kann oder idealerweise die komplette Ausführung in einer try/catch - Anweisung läuft. Sonst: Plopp
Wie gut, dass der Code in der RTL das schon übernimmt und jegliche Exception aus dem Thread Execute abfängt und an die Eigenschaft FatalException hängt, so dass das nicht passieren kann.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 11. Apr 2022, 10:54
zunächst erst einmal Dank für die konstruktiven Hinweise.
Doch so richtig weitergekommen bin ich noch nicht.
Gibt es denn nicht ein wirklich einfaches Beispiel für Hauptprogramm und ggf. 2 Threads, die synchronisiert werden ohne viel Schnick und Schnack.
Leider habe ich bisher nur mit div. Problemen überfrachtete Beispiele gefunden, die mir als Anfänger in dieser Sache nicht so richtig weiter helfen.
Den vorliegenden Code habe ich dahingehend verändert, dass nun im 2. Thread keine Schleife (bis 70) mehr enthalten ist sondern nur noch ein Activityindicator
mit anderem Aussehen. Also im Hauptprogramm wird eine Schleife bis 100 hoch gezählt und in den beiden Threads laufen die jeweils verschiedenen Activityindicatoren.
Diese laufen erkennbar beide gleichzeitig und wohl auch synchronisiert. Ist das also als Beispiel für ein Hauptprogramm mit 2 Threads tauglich?
Kennt jemand ein gutes Beispiel für meine Vorstellungen?
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 11. Apr 2022, 17:21
ich weiß nicht ob es hilft aber so erstelle ich threads meist über die API, hier nur grob dargestellt
Delphi-Quellcode:
var
  ThreadHandle,
  ThreadId: TThreadID


procedure ThreadProc;
begin
  // mach was, auch GUI könnte man hier updaten etc...

  // thread wird beendet
  ExitThread(0);
end;

procedure foobar;
begin
  // einen thread wartend initialisieren
  ThreadHandle := CreateThread(nil, LongWord(0), @ThreadProc, nil, CREATE_SUSPENDED, ThreadId);
  // priorität festlegen
  SetThreadPriority(ThreadHandle, THREAD_PRIORITY_ABOVE_NORMAL);

  // thread starten
  ResumeThread(ThreadHandle);


  // einen thread abschießen
  if ((ThreadHandle <> 0) and (ThreadHandle <> INVALID_HANDLE_VALUE)) then
  begin
    TerminateThread(ThreadHandle, 0);
    WaitForSingleObject(ThreadHandle, 50);
    if ((ThreadHandle <> 0) and (ThreadHandle <> INVALID_HANDLE_VALUE)) then
      CloseHandle(ThreadHandle);
  end;
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Renate Schaaf

Registriert seit: 25. Jun 2020
Ort: Lippe
114 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 11. Apr 2022, 18:31
There used to be an example in old versions of Delphi, which helped me to get started with threads. Apparently it is still available from here:
https://gist.github.com/jpluimers/8a...2ce7aaa8d4a2ea

Is ja die deutsche Seite . Also obiges Beispiel hat mir geholfen, als ich mit Threads angefangen habe.
Renate

Geändert von Renate Schaaf (11. Apr 2022 um 18:36 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.487 Beiträge
 
Delphi 12 Athens
 
#6

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 12. Apr 2022, 06:13
Auf jeden Fall sollte dir erst mal klar sein was Synchronize() überhaupt macht:
- der aufrufende Thread wird angehalten
- Wenn der Hauptthread irgendwann mal nichts zu tun hat wird die übergebene Methode vom Hautpthread aufgerufen und abgearbeitet. Während der Abarbeitung der Methode kann der Hauptthread natürlich nichts anderes machen.
- nachdem der Hauptthread die Methode beendet hat, wird auch der aufrufende Thread fortgesetzt
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#7

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 12. Apr 2022, 10:39
Die Frage ist doch auch, ob du dich in Threads einarbeiten und sie verstehen oder ob du ein Problem lösen möchtest, sprich: eine konkrete Aufgabe mit Threads schneller abarbeiten möchtest. Im zweiten Fall könntest du dir einfach die OTL (OmniThreadLibrary von Primož Gabrijelčič) anschauen. Auch sonst erfährst du in seinem Online-Buch und in den Beispielen auch einiges über die Architektur von Threads.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.045 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#8

AW: Verständnisfrage zur Thread-Synchronisation

  Alt 12. Apr 2022, 13:22
Auf jeden Fall sollte dir erst mal klar sein was Synchronize() überhaupt macht:
- der aufrufende Thread wird angehalten
- Wenn der Hauptthread irgendwann mal nichts zu tun hat wird die übergebene Methode vom Hautpthread aufgerufen und abgearbeitet. Während der Abarbeitung der Methode kann der Hauptthread natürlich nichts anderes machen.
- nachdem der Hauptthread die Methode beendet hat, wird auch der aufrufende Thread fortgesetzt
Ich bin mit deiner Formulierung etwas unglücklich - genauer gesagt die Wortwahl "wird angehalten" und "wird fortgesetzt". Das könnte missverstanden werden.
Der aufrufende Thread blockiert, bis der Hauptthread die Methode abgearbeitet hat und das signalisiert.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz