Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi thread (https://www.delphipraxis.net/74332-thread.html)

SirThornberry 1. Aug 2006 19:42

Re: thread
 
völlig klar das dein Programm hängt und zwar deswegen:
Delphi-Quellcode:
procedure Thread_Nr_02.Execute;
begin
  while not Terminated do begin
    Synchronize(Hauptprogramm);
  end;
end;
du syncronisierst ja durchweg (mit syncronize) den Thread mit dem Hauptprogramm-Thread. Und wenn es syncron zum Hauptprogramm läuft hängt das Hauptprogramm wenn der Thread hängt und umgekehrt.

Stell dir die Threads einfach mal als 2 Läufer vor. Normalerweise können beide unabhäng von einander Ihre strecke rennen und wenn einer eine Pause macht kann der andere trotzdem weiterlaufen. Mit Syncronize sorgst du allerdings dafür dass die Läufer sich die Hände reischen. Somit kann keiner mehr davon laufen und selbständig laufen weil er vom anderen festgehalten wird. Dadurch das du syncronize in einer Schleife hast halten sich die Läufer also immer wieder gegenseitig fest. Syncronize macht also nur sinn wenn der eine Läufer dem anderen was geben soll. Ansonsten sollten die beide Läufer möglichst nie Händchenhaltend rennen.

Oder anderes Beispiel: Du willst ein Stück Kuchen und eine Tube Haargel. Damit das schnell geht schickst du einen deiner Freunde zum Fleischer und den anderne ins Kaufland. Würde du beide zusammenketten (syncronize) würden die beiden Freunde die ganze Zeit miteinander quatschen und bräuchten länger als einer alleine. Deshalb sollte man die Freunde nie zusammenketten außer es ist unbedingt notwendig.


Wenn du mal wieder so einen Fehler wie "undefinierter Bezeichner" hast guck am besten als erstes in die Hilfe. Da steht in aller Regel bei funktionen dabei in welcher Unit sich diese befinden.

Nisbo 1. Aug 2006 20:06

Re: thread
 
ok das mit den läufern ist einleuchtend, aber wie laufen die jetzt richtig ?

ist das so korrekt ? weil so gehts zumindest

Delphi-Quellcode:
procedure Thread_Nr_02.Execute;
begin
  while not Terminated do begin
    Hauptprogramm
  end;
end;

Khabarakh 1. Aug 2006 20:15

Re: thread
 
Nein, jegliche Änderungen an VCL-Controls müssen in einem Synchronize-Kontext, also im Hauptthread, durchgeführt werden.

SirThornberry 1. Aug 2006 20:15

Re: thread
 
In deiner Funktion "Hauptprogramm" änderst du den Inhalt des Memos. Dieses Memo wird allerdings auf der grafischen Oberfläche des Hauptthreads dargestellt. Wenn du also aus deinem Thread die Funktion "Hauptprogramm" aufrufst machst du dinge im Hauptthread obwohl du ja eigentlich einen eigenen Thread genommen hast um dich von diesem zu lösen. Du solltest generell davon abstand nehmen in einem Thread auf das Haupprogramm zu zugreifen. Wenn du unbedingt auf das Hauptprogramm zugreifen musst, dann muss dies mit Syncronize passieren sonst kann es passieren das der Hauptthread und dein eigener Thread gleichzeitig auf etwas zugreifen und dann passieren lustige Effekte und nix geht mehr. Du müsstest dein Programm also umschreiben da du die Berechnungen alle im Thread machst und NUR ausgaben mit Syncronize im Hauptthread machst. Daher wurde am Anfang des Themas auch geschrieben das Threads nur sinn machen wenn du intensive Berechnungen hast (wo also nicht ständig auf den Hauptthread mit Ausgaben etc. zugegriffen wird). In deinem Beispiel solltest du auch ohne Thread auskommen und dafür mit "Application.ProcessMessages" dafür sorgen das die Anwendung nicht ganz einfriert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:17 Uhr.
Seite 3 von 3     123   

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