AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Progressbar/Label in einem Thread aktualisieren
Thema durchsuchen
Ansicht
Themen-Optionen

Progressbar/Label in einem Thread aktualisieren

Ein Thema von bennle · begonnen am 21. Okt 2007 · letzter Beitrag vom 22. Okt 2007
Antwort Antwort
bennle

Registriert seit: 22. Jul 2005
Ort: Kehl
139 Beiträge
 
Delphi 2007 Professional
 
#1

Progressbar/Label in einem Thread aktualisieren

  Alt 21. Okt 2007, 16:06
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??
Gruß
Benny
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Progressbar/Label in einem Thread aktualisieren

  Alt 21. Okt 2007, 16:16
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
bennle

Registriert seit: 22. Jul 2005
Ort: Kehl
139 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Progressbar/Label in einem Thread aktualisieren

  Alt 21. Okt 2007, 16:59
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.
Gruß
Benny
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Progressbar/Label in einem Thread aktualisieren

  Alt 21. Okt 2007, 17:06
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Progressbar/Label in einem Thread aktualisieren

  Alt 21. Okt 2007, 17:07
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 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).
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Progressbar/Label in einem Thread aktualisieren

  Alt 22. Okt 2007, 09:02
Zitat von bennle:
Gibt es da keine Lösung zu, denn um ehrlich zu sein, finde ich diese Variante "schöner" als TThread variante.
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)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Progressbar/Label in einem Thread aktualisieren

  Alt 22. Okt 2007, 09:14
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
bennle

Registriert seit: 22. Jul 2005
Ort: Kehl
139 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Progressbar/Label in einem Thread aktualisieren

  Alt 22. Okt 2007, 10:22
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?
Gruß
Benny
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#9

Re: Progressbar/Label in einem Thread aktualisieren

  Alt 22. Okt 2007, 10:27
Google
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:01 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