Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Rechenprozess manuell beenden
n0thin - So 24.01.10 20:53
Titel: Rechenprozess manuell beenden
Hi,
ich programmier' gerade ein Programm zu Sortieralgorithmen. Mit grafischer Ausgabe im Säulendiagramm, wobei auch die Zwischenschritte ausgegeben werden(per Delay), soll heißen, man sieht die Säulen wandern.
Nun, das Programm funktioniert wunderbar, nur eine Kleinigkeit stört mich: Wenn man während des Rechnenprozesses den Reset-Button klickt, werden zwar alle momentan vorhandenen Ausgaben gelöscht, dadurch, dass der Prozess aber noch weiter läuft, spuckt er ständig neues Zeug aus. Das will ich natürlich nicht. Ich suche also einen Befehl, mit dem man laufende Prozesse innerhalb des Programms abschießen kann. So etwas gibt es bestimmt, ich bin nur noch nicht so erfahren im Programmieren.
Danke im Vorraus,
MfG
Delete - So 24.01.10 20:55
Es gibt keine Prozesses inner halb eines Prozesses. Der Prozess ist der Container. Innerhalb eines Prozesses gibt es nur Threads. Und wenn du uns nicht sagst, wie dein Programm arbeitet, wird man dir kaum helfen können.
n0thin - So 24.01.10 23:27
Nun, mein Programm vergleicht, weist zu und gibt aus. Ich kann hier kaum den ganzen Quellcode posten, er ist auch nicht wirklich wichtig. Ich will nur, dass das Programm, sobald ich auf den Reset-Button drücke, aufhört zu sortieren und vor allem auszugeben. Der Prozess (oder wie auch immer) des Sortierens und Ausgebens soll also durch einen mir unbekannten Befehl aufgehalten werden und genau diesen Befehl suche ich hier. Ich bin mir recht sicher, dass es einen geben müsste, weil er ja nicht allzu selten benutzt werden würde.
MfG
Boldar - So 24.01.10 23:38
Ich nehme an, du willst einen Thread terminieren.
Das ist von aussen heraus schwer, da gibt es keinen allgemeinen Befehl.
Ohne den Quellcode oder zumindest ein paar Informationen kann ich dir auch nicht weiterhelfen.
mfg Boldar
Bergmann89 - So 24.01.10 23:41
Hey,
wie Luckie schon gesagt hat geht das Ohne den Quelltext schwer, weil wir ja nicht wissen wie genau du das machst. Wenn du nen Timer benutz, da musst du einfach nur den Timer anhalten, wenn du ne endlosschleife hast, dann kannst du die über break; vrelassen. Wenn du es über OnIdle machst, müstest du ne Boolean-Variable machen un nur in die eigentlichen SortierTeil reinspringen, wenn der Boolean True is...
Es gibt n haufen Mehtoden das zu machen, aber die besste können wir dir nur sagen wenn du uns den Quelltext zeigst, oder ausführlich beschreibst, wie das Programm arbeitet...
MfG Bergmann
Delete - Mo 25.01.10 00:07
Und es gibt noch Threads. Also was nutzt du jetzt?
jaenicke - Mo 25.01.10 02:24
Sollte es sich um einen Thread handeln, dann kannst du beim Thread Terminate aufrufen. Dadurch wird Terminated auf True gesetzt, so dass du innerhalb des Threads weißt, dass du abbrechen musst.
Zum Rest wurde ja schon etwas gesagt. Und allgemein gibt es eben nix. Da musst du schon schreiben was du machst.
jfheins - Mo 25.01.10 09:25
Wahrscheinlich verwendet er Application.ProcessMessages ...
In diesem Fall musst du eine art abbruch-variable setzen, die du dann nach dem Aufruf auswerten kannst und ggf. abbrechen.
Delete - Mo 25.01.10 11:51
Ich glaube, es wäre sinnvoll, wenn sich der Threadstarter erstmal dazu äußern würde, wie er es macht bevor wir hier weiter sinnlos rumraten.
n0thin - Mo 25.01.10 16:26
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure MinSort; ... ... for i := 0 to High(Feld) - 1 do begin Inc(Zuweisungen); Min := i; Inc(Zuweisungen); for j := i + 1 to High(Feld) do begin Inc(Zuweisungen); if Feld[j] < Feld[Min] then begin Min := j; Inc(Zuweisungen); end; end; Temp := Feld[Min]; Feld[Min] := Feld[i]; Feld[i] := Temp; Inc(Zuweisungen,3); Inc(Vertauschungen); end; ... |
So, das ist einer meiner Algorithmen zum Sortieren.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.BitBtnResetClick(Sender: TObject); begin Leeren; ImgGrafik.Picture:=(nil); Sperren; end; |
Und hier die OnClick-Prozedur. Wenn ich jetzt auf diesen Button klicke soll die obere Prozedur sofort beendet werden. Da es eben sofort und nicht erst später sein soll und die Ausgabe auch noch wo anders geregelt ist, kann ich keinen Exit-Befehl irgendwo in die Schleife reinpacken, wie mir heute jemand empfohlen hat.
Was genau das jetzt ist, davon hab ich nicht allzu viel Ahnung
Bergmann89 - Mo 25.01.10 16:47
Hey,
mit Exit kannst du aus der aktuellen Prozedur rausspringen, also sie beenden. Mach dir ne Booleanvariable, die du beim Buttonclick auf True setzt uns dann prüfst du in der Schleife des Sortieralgos ob die Variable True is, wenn ja dann exit;
Das is die einfache Lösung. Wenn ud's professioneller haben willst, solltest du auf Threads umsteigen...
MfG Bergmann
n0thin - Mo 25.01.10 16:57
Ja, genau das hatte ich schon getan, nur ich hatte nen gewaltigen Denkfehler drin^^
naja, danke an alle, die mir helfen wollten oder geholfen haben, es funktioniert jetzt...
Narses - Mo 25.01.10 17:04
Moin!
Markierst du den Thread noch entsprechend, wenn dein Problem gelöst ist? Danke. ;)
cu
Narses
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!