AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

function/procedure pausieren verhindern

Ein Thema von calculon · begonnen am 10. Jun 2007 · letzter Beitrag vom 11. Jun 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#1

function/procedure pausieren verhindern

  Alt 10. Jun 2007, 17:33
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
--
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#2

Re: function/procedure pausieren verhindern

  Alt 10. Jun 2007, 17:39
In dem man die ganze Procedur in einem eigenem Thread ausführt.
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#3

Re: function/procedure pausieren verhindern

  Alt 10. Jun 2007, 17:48
Mit Threads hab' ich noch nie was zu tun gehabt. Ist das sehr kompliziert oder für mein Problem schnell und einfach umsetzbar?
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#4

Re: function/procedure pausieren verhindern

  Alt 10. Jun 2007, 17:53
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.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#5

Re: function/procedure pausieren verhindern

  Alt 10. Jun 2007, 17:56
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

Re: function/procedure pausieren verhindern

  Alt 10. Jun 2007, 17:58
Im Verzeichnis Demos von Delphi ist ein gutes Beispiel dabei
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
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#7

Re: function/procedure pausieren verhindern

  Alt 10. Jun 2007, 17:58
Beginthread
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
SirTwist

Registriert seit: 28. Sep 2006
198 Beiträge
 
Delphi XE Professional
 
#8

Re: function/procedure pausieren verhindern

  Alt 11. Jun 2007, 01:32
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.
  Mit Zitat antworten Zitat
Benutzerbild von calculon
calculon

Registriert seit: 16. Sep 2006
256 Beiträge
 
Delphi 7 Personal
 
#9

Re: function/procedure pausieren verhindern

  Alt 11. Jun 2007, 14:49
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?
  Mit Zitat antworten Zitat
SirTwist

Registriert seit: 28. Sep 2006
198 Beiträge
 
Delphi XE Professional
 
#10

Re: function/procedure pausieren verhindern

  Alt 11. Jun 2007, 17:16
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:30 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