| Autor |
Beitrag |
kat1
      
Beiträge: 40
Win XP
D6 EntPr
|
Verfasst: Di 17.06.03 09:46
Hallo,
die Antwort auf meine Frage ist sicherlich einfach, aber ich habe einfach noch keine Erfahrung mit Delphi.
Ich habe mir ein Programm geschrieben, welches mir bis zu 200000 Koeffizienten berechnet und diese in eine Datei speichert. Klappt auch alles wunderbar. Leider ist diese Berechnung sehr zeitintensiv (bis zu 5 Tage). Wenn das jemandem, der den Rechner nutzen will zu lange ist, so soll das Programm abbruchfähig sein, wenn auf den Close Button geklickt wird. Allerdings ist das Programm so mit der Berechnung beschäftigt, dass es dieses Ereignis ignoriert. Gibt es nicht einen Befehl, mit dem ich den Abbruch dennoch provozieren kann.
Ein weiteres Problem, welches im gleichen Zusammenhang auftritt. Ich kann auch nicht mehr mit anderen Windows-Programmen arbeiten, da sich das Fenster nicht mehr in den Hintergrund bekommen lässt bzw. ein Minimieren auch nicht funktioniert.
Wäre schön, wenn jemand eine Lösung dazu hat. Schon mal im voraus vielen Dank.
Uwe
|
|
foxy
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: Di 17.06.03 09:57
guden
also ich denke du machst das alles in schleifen.
dann bau in jede schleife ne abfrage rein, ob buttonclick iss dann einfach exit; break; oder close;
also so würde ich es mal versuchen
_________________ "Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Di 17.06.03 10:01
Hallo
wenn du Schleifen verwendest, setzt ein application.processmessages in jeden Durchlauf/je nach Berechnung aller paar Druchläufe, damit dein Programm noch reagieren kann. Ob das mit dem close dann schon funktioniert, weiß ich jetzt nicht. Mit Abbruchbutton siehe z.B. hier:
www.delphi-forum.de/...t=schleife+abbrechen
Mfg Frank
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
foxy
      
Beiträge: 814
Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
|
Verfasst: Di 17.06.03 10:02
keldorn close glaub ich au nich das das geht aber exit ... bzw. break geht
_________________ "Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
|
|
Keldorn
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: Di 17.06.03 10:09
auf meinen im anderen Thread gepostete Code:
einfach ins Fromclose noch Stop:=true setzten, dann gehts.
das application.preocessmessages brauchst du aber in jedem Fall.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TForm1.ButtonStopClick(Sender: TObject); begin stop:=true; end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin stop:=true; end;
procedure TForm1.ButtonStartClick(Sender: TObject); Var I:integer; begin stop:=false; for i:=1 to 1000 do begin label1.Caption:=inttostr(i); sleep(30); if stop then break; Application.ProcessMessages; end; end; |
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
MAlsleben
      
Beiträge: 303
W2k,WinXP
D3 - DXE3 Enterprise
|
Verfasst: Di 17.06.03 10:11
Hi,
ich würde in dem Fall die Berechnung in einem seperaten Thread laufen lassen. So bleibt das MainForm steuerbar( Klein machen usw.). Beim AbruchButton kannst Du dann MyThread.terminate und was du sonst noch so zum kontrollierten Beenden brauchst reinschreiben.
MfG Micha.
_________________ Viele Wege führen nach Rom.
|
|
kat1 
      
Beiträge: 40
Win XP
D6 EntPr
|
Verfasst: Di 17.06.03 10:12
Hallo nochmal,
danke funktioniert einwandfrei. Mit dem Application.ProcessMessages kann ich jetzt sogar zwischendurch weiter arbeiten.
Uwe
|
|
Popov
      
Beiträge: 1655
Erhaltene Danke: 13
WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
|
Verfasst: Di 17.06.03 14:36
Wie gesagt, mit Application.ProcessMessages dauert die Schleife um vielfaches länger (je nach dem auch das doppelte an Zeit). Es lohnt sich also schon einen Counter einzusetzten, der dafür sorgt, daß Application.ProcessMessages nur alle (z.B.) 30 Durchläufe ein mal ausgeführt wird. Das Programm kann immer noch beendet und auch verschoben werden, auch wenn es ein wenig zähflüssiger ist.
_________________ Popov
|
|
kat1 
      
Beiträge: 40
Win XP
D6 EntPr
|
Verfasst: Di 17.06.03 14:39
Jo, das hab ich gemerkt, aber da ich da sowieso 6 Schleifen ineinander geschachtelt habe, setze ich das ProcessMessages einfach in eine äußere Schleife. Nochmals danke.
Uwe
|
|