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 Thread wird nicht ausgeführt (https://www.delphipraxis.net/142566-thread-wird-nicht-ausgefuehrt.html)

TheMiller 30. Okt 2009 11:25


Thread wird nicht ausgeführt
 
Hallo,

ich lasse in einer Schleife mehrere Reports drucken (bis zu 100 Stück) - hier handelt es sich um ein Mahnwesen-Plugin. Nun möchte ich, dass während dem Druck die Form2 angezeigt und ständig neu gezeichnet wird. Es ist eine "Bitte-warten"-Form mit einer UbuntuProgressBar.

Dazu habe ich einen simplen Thread gebaut. Hier mal der Code.

Delphi-Quellcode:
TRefreshThread = class(TThread)
  private

  public
    Form: TForm;
    kill: Boolean;
  protected
    procedure ShowForm;
    procedure doRefresh;
    procedure Execute; override;
  end;

procedure TRefreshThread.ShowForm;
begin
  ShowMessage('SD');
  Form2.Visible:=True;
end;

procedure TRefreshThread.doRefresh;
begin
  while not (kill) do
  begin
    Form2.Refresh;
    Form2.Repaint;
  end;
end;

procedure TRefreshThread.Execute;
begin
  ShowForm; //Fehlerbeschreibung weiter unten
  Synchronize(doRefresh); //Fehlerbeschreibung weiter unten
end;

//Aufruf:
procedure ....
var
  ...
begin
  rt:=TRefreshThread.Create(True);
  rt.kill:=False;
  rt.Form:=Form2;
  rt.Resume;
  ...
end;
Wenn ich in der Execute-Methode beide Methoden mit Synchronize aufrufe tut sich garnichts. Keine Form poppt auf, keine Message. Rufe ich eine / oder beide Methode ohne Synchronize auf, poppt Form2 und die MessageBox auf, aber erst nachdem der Druckvorgang abgeschlossen ist.

Was mache ich falsch? Das müsste doch so funktionieren?

Vielen Dank

Klaus01 30. Okt 2009 11:31

Re: Thread wird nicht ausgeführt
 
dein Thread beendet sich ja sofort wieder.
[edit2] nein tut er nicht, er verharrt in der Schleife von doRefresh.

Delphi-Quellcode:
procedure TRefreshThread.Execute;
begin
  ShowForm; //Fehlerbeschreibung weiter unten
  Synchronize(doRefresh); //Fehlerbeschreibung weiter unten
end;
vielleicht funktioniert es ja so:
Delphi-Quellcode:
procedure TRefreshThread.Execute;
begin
  ShowForm; //Fehlerbeschreibung weiter unten
  while not terminated do
    begin
      Synchronize(doRefresh); //Fehlerbeschreibung weiter unten
      sleep(250);
    end;
end;

[edit]
das do refresh dann so umbauen:

Delphi-Quellcode:
procedure TRefreshThread.doRefresh;
begin
  Form2.Refresh;
  Form2.Repaint;
end;
Grüße
Klaus

Andreas L. 30. Okt 2009 11:51

Re: Thread wird nicht ausgeführt
 
ShowForm sollte aber auch synchronisiert werden, es wird ja auf die Form zugegriffen.

TheMiller 30. Okt 2009 11:58

Re: Thread wird nicht ausgeführt
 
Ja, habe ich ja gemacht. Ich wollte damit nur zeigen, dass ShowForm nur dann aufgerufen wird, wenn ich kein Synchronize verwende. Verwende ich dieses, wird ShowForm auch nicht aufgerufen. Warum auch immer...

Ich habe die vorgeschlagene Codeänderung übernommen, und funktioniert auch nicht.

Was mir gerade einfällt. Wenn ich komplett ohne Synchronize arbeite, dann funktioniert alles. Kann das daran liegen, dass das Mahnungsmodul eine DLL-Form ist, die dynamisch vom Hauptprogramm geladen wird? Ohne Synchronize funktioniert das einwandtfrei und ohne Fehler. Kann so sogar die VCL ändern. Mit Synchronize geht es garnicht -> kein Methodenaufruf möglich.

Klaus01 30. Okt 2009 12:02

Re: Thread wird nicht ausgeführt
 
vielleicht magst Du dir mal diesen Thread durchlesen.

Grüße
Klaus

TheMiller 30. Okt 2009 12:05

Re: Thread wird nicht ausgeführt
 
Ok, habe ihn gelesen. Werde es genauso machen, wie siruis es vorgeschlagen hat. Allerdings schiebe ich das ein bissl auf ;)

Vielen Dank!


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