AGB  ·  Datenschutz  ·  Impressum  







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

thread

Ein Thema von Nisbo · begonnen am 1. Aug 2006 · letzter Beitrag vom 1. Aug 2006
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#21

Re: thread

  Alt 1. Aug 2006, 20:42
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Nisbo

Registriert seit: 10. Mär 2005
191 Beiträge
 
Delphi 5 Standard
 
#22

Re: thread

  Alt 1. Aug 2006, 21:06
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;
Jens
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#23

Re: thread

  Alt 1. Aug 2006, 21:15
Nein, jegliche Änderungen an VCL-Controls müssen in einem Synchronize-Kontext, also im Hauptthread, durchgeführt werden.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#24

Re: thread

  Alt 1. Aug 2006, 21:15
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 21:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz