Autor Beitrag
kat1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 40

Win XP
D6 EntPr
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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.
ausblenden 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
  //Geschwindigkeit mal außer acht gelassen ;)
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 303

W2k,WinXP
D3 - DXE3 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 40

Win XP
D6 EntPr
BeitragVerfasst: Di 17.06.03 10:12 
Hallo nochmal,

danke funktioniert einwandfrei. Mit dem Application.ProcessMessages kann ich jetzt sogar zwischendurch weiter arbeiten. :lol:

Uwe
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 40

Win XP
D6 EntPr
BeitragVerfasst: 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