Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Probleme mit einem Thread


ebs - Mo 19.01.09 15:58
Titel: Probleme mit einem Thread
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 - Mo 19.01.09 16:39
Titel: Re: Probleme mit einem Thread
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 - 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.

Delphi-Quelltext
1:
Thread := TThread.Create(false);                    


in der ThreadUnit steht dann folgendes unter Execute:


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.


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 - 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 - Mo 19.01.09 17:23

Ok, danke dir.