Delphi-PRAXiS
Seite 1 von 2  1 2      

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 function/procedure pausieren verhindern (https://www.delphipraxis.net/93731-function-procedure-pausieren-verhindern.html)

calculon 10. Jun 2007 16:33


function/procedure pausieren verhindern
 
Hi Leute,

wenn ich beispielsweise eine Prozedur habe:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to 1000000 do
  begin
    listbox1.Items.Add(inttostr(i));
    application.ProcessMessages;
  end;
end;
und während diese läuft und ich in der Listbox scrolle oder die Form auf dem Desktop verschiebe, dann pausiert die Prozedur bis ich die Maus wieder loslasse. Kann man das unkompliziert verhindern?

Gruß

Calculon
--

sniper_w 10. Jun 2007 16:39

Re: function/procedure pausieren verhindern
 
In dem man die ganze Procedur in einem eigenem Thread ausführt.

calculon 10. Jun 2007 16:48

Re: function/procedure pausieren verhindern
 
Mit Threads hab' ich noch nie was zu tun gehabt. Ist das sehr kompliziert oder für mein Problem schnell und einfach umsetzbar?

Elvis 10. Jun 2007 16:53

Re: function/procedure pausieren verhindern
 
Zitat:

Zitat von calculon
und während diese läuft und ich in der Listbox scrolle oder die Form auf dem Desktop verschiebe, dann pausiert die Prozedur bis ich die Maus wieder loslasse. Kann man das unkompliziert verhindern?

Ja, einfach kein ProcessMessages ausführen. Denn dait sagst du ja explizit dass genau das gemacht werden soll: Die Nachrichtenschlange abarbeiten.

calculon 10. Jun 2007 16:56

Re: function/procedure pausieren verhindern
 
Zitat:

Zitat von Elvis
Ja, einfach kein ProcessMessages ausführen. Denn dait sagst du ja explizit dass genau das gemacht werden soll: Die Nachrichtenschlange abarbeiten.

Das ist zwar in der Tat unkompliziert, aber auch nicht das was ich brauche, da wenn ich die ProcessMessages nicht ausführe das Programm nicht gecanceled werden kann.

Hat jemand ein gutes Thread-Tutorial für mich?

DeddyH 10. Jun 2007 16:58

Re: function/procedure pausieren verhindern
 
Im Verzeichnis Demos von Delphi ist ein gutes Beispiel dabei ;)

sniper_w 10. Jun 2007 16:58

Re: function/procedure pausieren verhindern
 
Beginthread

SirTwist 11. Jun 2007 00:32

Re: function/procedure pausieren verhindern
 
Zitat:

Zitat von calculon
Das ist zwar in der Tat unkompliziert, aber auch nicht das was ich brauche, da wenn ich die ProcessMessages nicht ausführe das Programm nicht gecanceled werden kann.

Wenn Du die gesamte For-Schleife mit einem BeginUpdate/EndUpdate versiehst, sollte das Füllen der Listbox so schnell gehen, dass du kein Cancel benötigst:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  with listbox1.Items do begin
    BeginUpdate;
    for i := 0 to 1000000 do
      Add(inttostr(i));
    EndUpdate;
  end;
end;
Normalerweise wird die Listbox nach jedem Add() neu gezeichnet und das dauert. Mit dem BeginUpdate/EndUpdate wird der Listbox signalisiert, dass nun an der Liste umfangreiche Änderungen vorgenommen werden und ausnahmsweise mal nicht alles neu gezeichnet werden muss. Achtung: niemals das EndUpdate vergessen.

calculon 11. Jun 2007 13:49

Re: function/procedure pausieren verhindern
 
Zitat:

Zitat von SirTwist
Wenn Du die gesamte For-Schleife mit einem BeginUpdate/EndUpdate versiehst, sollte das Füllen der Listbox so schnell gehen, dass du kein Cancel benötigst:

Heißt das, wenn ich BeginUpdate und EndUpdate benutze werden alle Prozeduren, die die Listboxen beschreiben in Lichtgeschwindigkeit ausgeführt?

SirTwist 11. Jun 2007 16:16

Re: function/procedure pausieren verhindern
 
Zitat:

Zitat von calculon
Heißt das, wenn ich BeginUpdate und EndUpdate benutze werden alle Prozeduren, die die Listboxen beschreiben in Lichtgeschwindigkeit ausgeführt?

Ja genau.

Ich habs grad mal ausgetestet, man kommt ca. auf den Faktor 10, was das Hinzufügen der Listbox-Einträge angeht.

Wenn Du wirklich auf Benutzeraktionen reagieren willst, dann brauchst du das aber nicht bei jedem Schleifendurchlauf zu machen:
Delphi-Quellcode:
if (i mod 1000) = 0 then begin
  Application.ProcessMessages;
  if BtnCancel.Tag = 1 then begin // Vorrausgesetzt, dein Cancel-Button setzt das Tag auf "1" wenn gedrückt.
    ListBox.Items.EndUpdate;
    exit; // Schleife abbrechen
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:19 Uhr.
Seite 1 von 2  1 2      

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