Autor Beitrag
ebs
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 213

Suse Linux 9.2, Win 98, Win NT, Win XP, Win for Workgroups, Win XP SP2, Dos 6.1
D3 Prof, D2005 PE, Delphi 2006 Prof.
BeitragVerfasst: Mo 19.01.09 15:58 
Hallo,
ich habe mir eine durchlaufende Progressbar gebastelt (wie sie bei XP am Anfang ist). Diese habe ich mit einem Thread verbunden (TThread). Das funktioniert auch alles wunderbar. Wenn ich allerdings sehr rechenintensive Sachen berechnen lassen, führ er das execute Kommando nicht aus. Erst, wenn er wieder fertig ist, was für eine Progressbar natürlich Blödsinn ist.
An den Prioritäten hab ich schon ohne Erfolg rumgespielt.
Was für Möglichkeiten gibt es nun die Bar bei den Berechnungen laufen zu lassen?
lG,
Bent
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 19.01.09 16:39 
user profile iconebs hat folgendes geschrieben Zum zitierten Posting springen:
ich habe mir eine durchlaufende Progressbar gebastelt (wie sie bei XP am Anfang ist). Diese habe ich mit einem Thread verbunden (TThread).
Wie meinst du das verbunden?
Ich denke du hast eine Marquee Bar, die keinen Fortschrittswert anzeigt, oder?

Wenn die Berechnungen in einem extra Thread ausgeführt werden, dann sollte der Hauptthread mit der ProgressBar davon nicht behindert werden.

Wenn du im Hauptthread Berechnungen durchführst, dann musst du dazwischen Application.ProcessMessages aufrufen, aber das ist hier ja wohl nicht der Fall (es sei denn du benutzt Sleep oder so um auf den Thread zu warten, aber das wäre ja Quatsch).

Ohne zu zeigen was du eigentlich wie machst, kann ich dazu nichts genaueres sagen. :nixweiss:
ebs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 213

Suse Linux 9.2, Win 98, Win NT, Win XP, Win for Workgroups, Win XP SP2, Dos 6.1
D3 Prof, D2005 PE, Delphi 2006 Prof.
BeitragVerfasst: Mo 19.01.09 16:49 
OK, ich versuchs nocheinmal ein bisschen deutlicher zu machen:

In meinem Hauptthread (also dem normalen Programm) werden iterativ ständig Werte berechnet ( das dauert so ca. 1-2 min).
Voher erstelle ich ein Thread.
ausblenden Delphi-Quelltext
1:
Thread := TThread.Create(false);					


in der ThreadUnit steht dann folgendes unter Execute:

ausblenden Delphi-Quelltext
1:
2:
 while not Terminated do 
  Synchronize( FormBar.DOChase);


Dieses FormBar.DoChase steht in einer anderen Unit in der einfach die Bar ein Stückchen weiter gezeichnet wird.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
      Image2.Canvas.CopyRect(Rect(0,0,600,166), Image1.Canvas, Rect(0,0,600,166) );
       Image2.Canvas.Rectangle(ChasePos, 0, ChasePos+100166);
        Image2.Canvas.Brush.Color := clblack;
    Image2.Update;
    ChasePos := ChasePos+1;
    If ChasePos > 600 then
     ChasePos := -100;

ChasePos ist dabei eine globale Variable in der Unit FormBar.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 19.01.09 17:19 
user profile iconebs hat folgendes geschrieben Zum zitierten Posting springen:
In meinem Hauptthread (also dem normalen Programm) werden iterativ ständig Werte berechnet ( das dauert so ca. 1-2 min).
Das ist doch genau das, was man mit einem Thread verhindern möchte...
Die Berechnungen gehören in den Thread, nicht umgekehrt.

Synchronize bewirkt, dass der Zugriff auf die visuellen Komponenten im Kontext des Hauptthreads stattfindet. Wenn der jedoch mit der Berechnung beschäftigt ist, kann der Thread natürlich auch nicht mehr deine Oberfläche aktualisieren. Dadurch wird dann der Einsatz eines Threads ad absurdum geführt.

Richtig wäre es, die Berechnung in den Thread auszulagern, damit die Oberfläche eben gerade nicht blockiert.
ebs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 213

Suse Linux 9.2, Win 98, Win NT, Win XP, Win for Workgroups, Win XP SP2, Dos 6.1
D3 Prof, D2005 PE, Delphi 2006 Prof.
BeitragVerfasst: Mo 19.01.09 17:23 
Ok, danke dir.