Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Progressbar/Label in einem Thread aktualisieren (https://www.delphipraxis.net/101967-progressbar-label-einem-thread-aktualisieren.html)

bennle 21. Okt 2007 15:06


Progressbar/Label in einem Thread aktualisieren
 
Hallo,
Ich habe mal folgenden simplen Code erstellt:
Delphi-Quellcode:
function ThreadDoit(p: Pointer): Integer;
begin
  //TLabel Beschreiben
  Form5.Label5.Caption := 'Tue das ...';
  //Funktion aufrufen
  Form5.Function1();
  //TLabel Beschreiben
  Form5.Label5.Caption := 'Erledige das 2te...';
  //Funktion aufrufen
  Form5.Function2();
//Resultat
  result := 0;
end;
procedure TForm5.Begin(Sender: TObject);
var
  hThread : THandle;
  ThreadID : Cardinal;
  WaitResult : DWORD;
  Msg : TMsg;
begin
  hThread := BeginThread(nil, 0, @ThreadDoit, nil, 0, ThreadID);
  repeat
    WaitResult := MsgWaitForMultipleObjects(1, hThread, False, INFINITE, QS_ALLINPUT);
    if WaitResult = WAIT_OBJECT_0 + 1 then
    begin
      while PeekMessage(Msg, Handle, 0, 0, PM_REMOVE) do
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end;
  until WaitResult = WAIT_OBJECT_0
end;
Leider werden bei mir keine Formelemente erneuert/beschrieben. Weder die Progressbar noch das Label erhält die gewünschte Eigenschaft zugeordnet.
Was mach ich falsch oder wie bekomme ich das zum laufen??

alzaimar 21. Okt 2007 15:16

Re: Progressbar/Label in einem Thread aktualisieren
 
Wieso verwendest Du nicht einfach einen TThread-Nachkommen und führst die Aufrufe der VCL (Label / Progressbar) mit der Synchronize-Methode durch? Schau Dir mal die Demos hierzu an.

bennle 21. Okt 2007 15:59

Re: Progressbar/Label in einem Thread aktualisieren
 
Zitat:

Zitat von alzaimar
Wieso verwendest Du nicht einfach einen TThread-Nachkommen und führst die Aufrufe der VCL (Label / Progressbar) mit der Synchronize-Methode durch? Schau Dir mal die Demos hierzu an.

Hmm, was ist den so falsch daran die API zu verwenden? Warum funktioniert es denn nicht?
Gibt es da keine Lösung zu, denn um ehrlich zu sein, finde ich diese Variante "schöner" als TThread variante.

Apollonius 21. Okt 2007 16:06

Re: Progressbar/Label in einem Thread aktualisieren
 
Ja, die API hat auch Vorteile, aber die VCL ist so aufgebaut, dass nur aus dem Hauptthread auf die Controls zugegriffen werden darf. Du müsstest also dem Hauptthread eine Nachricht schicken, dass er diese Controls eben verändern soll. Genau das macht TThread.Synchronize.

Bernhard Geyer 21. Okt 2007 16:07

Re: Progressbar/Label in einem Thread aktualisieren
 
Zitat:

Zitat von bennle
Warum funktioniert es denn nicht?

Weil man VCL-GUI-Controls (und generell Windows-GUI-Controls) nur vom Hauptthread aus zugreifen darf. Die VCL (und auch das Windows GDI) ist nicht auf sowas ausgelegt.

Zitat:

Zitat von bennle
Gibt es da keine Lösung zu, denn um ehrlich zu sein, finde ich diese Variante "schöner" als TThread variante.

Eine Lösung hat alzaimar schon genannt: Synchronize. Oder du schickst dir eine Windows-Message und aktualisierst erst dort die GUI (und bist damit dann auch im Hauptthead).

alzaimar 22. Okt 2007 08:02

Re: Progressbar/Label in einem Thread aktualisieren
 
Zitat:

Zitat von bennle
Gibt es da keine Lösung zu, denn um ehrlich zu sein, finde ich diese Variante "schöner" als TThread variante.

:gruebel: Da entscheidet man sich für das #1 RAD-Tool (RAD=Rapid Application Development) Delphi und will das RAD dann zweimal erfinden.

Du sollest die Delphi-Libraries verwenden, dafür wurden sie schließlich gemacht. Du setzt dich ja auch ins Auto mit Klimaanlage und Servolenkung, obwohl Du gut und gerne auf den ganzen Schnickschnack (Karosserie? Fenster? Sitze? Pah!) verzichten könntest...

Nur wenn du -aus welchen Gründen auch immer- eine schlanke EXE benötigst, dann solltest Du auf SysUtils, Classes etc. verzichten, denn der Overhead ist schon gewaltig (obwohl das relativ ist: Meine EXEn haben 10-12MB und da ist es mir wurscht)

sirius 22. Okt 2007 08:14

Re: Progressbar/Label in einem Thread aktualisieren
 
Zitat:

Zitat von bennle
Warum funktioniert es denn nicht?

Abgesehen von allen anderen Problemen, wartet dein Hauptthread bei waitformultipleobjects "infinite" und wird somit auch nicht die Form5 aktualisieren.

bennle 22. Okt 2007 09:22

Re: Progressbar/Label in einem Thread aktualisieren
 
Hallo,
ok, danke für die Tips!
Ich werde es mal mit einem TThread versuchen.Gibt es eigentlich ein anderes Tutorial als das von M. Puff?

DeddyH 22. Okt 2007 09:27

Re: Progressbar/Label in einem Thread aktualisieren
 
Google


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:49 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