Entwickler-Ecke
Windows API - Thread anhalten, speichern und später fortsetzen
MATHEBUG - So 05.09.04 22:33
Titel: Thread anhalten, speichern und später fortsetzen
Hallo...
ich weiß zwar nicht, ob ich in dieser Rubrik richtig bin, aber mein Problem ist Folgendes:
Ich habe einen Thread, der mir meine Steine (Türme von Hanoi) sortiert.
Nun habe ich diesen Thread angehalten und möchte diesen nun speichern und zu einem späteren Zeitpunkt fortsetzen.
Die Schwierigkeit besteht darin, dass der Algorithmus zum Sortieren ein rekursiver ist und sich somit mehrmals selbst aufruft.
Wenn ich diesen nun anhalte, hat er sich also x - mal aufgrufen. Diesen Status möchte ich nun in einem Stream oder so speichern.
Ist dies möglich ?
Dabei geht es nicht darum, dass die Steine nach dem Laden richtig dargestellt werden, sondern es soll nur der Algorithmus an der Stelle weitermachen, wo er aufgehört hat. Alles Andere (grafische) paßt soweit schon.
Nur bringt es mir nicht viel, wenn der Algorithmus jedes mal von vorne beginnt und mir meine Steine durcheinander legt ;)...
Ich danke Euch schonmal im Voraus für Eure Hilfe,
Grüße Mathebug
Delete - So 05.09.04 22:36
Was benutzt du die Windows API direkt oder die Delphi Thread Klasse? Stcihworte wären hier Resume und Suspend, entweder als Methode von TThread oder als API Funktionsaufrufe.
MATHEBUG - So 05.09.04 22:39
Ich benutze die Delphi Thread Klasse...
Deine Stichworte wie Suspend und Resume helfen doch nur, solange der Thread nicht beendet wird.
Wenn ich aber mein Programm neu starte oder es nach 2 Tagen laden möchte, ist der Thread beendet.
Deswegen muß dies (oder auch nicht) in eine Datei geschrieben werden.
Ansonsten könnte ich ja tricksen und solange wie der Rechner noch läuft den Thread einfach im Hintergrund aktiv halten ;).
THX for Support,
Grüße Mathebug
uall@ogc - Mo 06.09.04 21:14
GetThreadContext / SetThreadContext um die register auszulesen und wieder herzustellen :)
dann halt noch stack sichern etc. bisl in asm halt usw.
MATHEBUG - Mo 06.09.04 22:08
Kannst du mir bitte mal ein Beispiel anfügen...
oder mir mal bitte schreiben, wie ich den Stack sichern kann.
Thx,
Grüße Mathebug
Delete - Di 07.09.04 16:33
Wenn das ganze rekursiv ist, dann ist es doch kein Problem. Speicher doch einfach die Werte, die gerade errechnet wurden und führe dann später beim erneutem Starten die Rekursion mit diesen Werten fort:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function summe(n: word): longint; begin if n = 1 then summe := 1 else summe := n + summe(n - 1); end;
procedure TForm1.Button1Click(Sender: TObject); var sum1, sum2: Longint; begin sum1 := summe(10); ShowMessage(IntToStr(sum1)); sum2 := summe(sum1); ShowMessage(IntToStr(sum2)); end; |
Bei einer Rekursion kannst du doch bei jede beliebigen Stelle anfangen.
Und das mit dem Stack sichern, davon würde ich meine Finger lasse.
MATHEBUG - Di 07.09.04 20:18
@ Luckie...
Bei meiner rekursiven Vorschrift zum Sortieren meiner Scheiben bei den Türmen von Hanoi, ruft sich die Schleife immer wieder von selbst neu auf...und dies macht sie so oft, je nachdem wie viele Scheiben man hat. Das Problem hierbei ist, dass die Prozedur von Innen nach außen abgearbeitet wird und dass sich bei jedem neuen Aufruf 3 weitere öffnen. Diese geöffneten Schliefen muß man speichern, wenn man möchte, dass er an der entsprechenden Stelle weitermacht, an der man vorher gestoppt hat.
hier mal der Quelltext der Schleife...(Ausgabe in einem Memo);
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure bewege_turm(n : integer; platz1, platz2, platz3 : string); var i,y,z,Anzahl: integer; begin y:=0; z:=0; Anzahl:= steine.Anzahl; if n = 1 then begin Proto.Memo1.Lines.Add(platz1+' --> '+platz2); end else begin bewege_turm(n-1,platz1, platz3, platz2); bewege_turm(1,platz1,platz2,platz3); bewege_turm(n-1,platz3,platz2,platz1); end; |
uall@ogc - Di 07.09.04 21:15
nehmen wir mal folgende sinnlose rekursion an:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure bla(i: integer); begin if i < 100 then bla(i+1); listbox1.items.add(inttostr(i); end; |
aufruf
bzw.
etwas
wie
in der rekursion, oder halt rückgabe werte in der rekursion, dann ist das resultat nicht das selbe wenn ich einfach weiterlaufen lasse ohen vorher den stack wieder herzustellen, da vill vorherige daten die auf dem stack liegen für die nächste rekursion benutzt werden
das mit listbix is bisl schlecht aber ich meine damit das ja die daten bei bla(1) erst wieder ganz am schluss angezeigt werden also die liste so aussieht
100
99
98
etc.
und halt die daten die als erste rekursion benutzt werden bla(1) ja später bei der letzen rekursion bla(100) ja wieder benötigt werden
ich weiss das es mit dem stacksicher shcon sehr kompliziert wird ist aber denk ich mal wenns es funzt die beste möglichkeit
(am besten in nen thread auslagern, dann ist die satcksicherung einfacher) aber glaub dafür soltle man schon bisl skill haben um das zu realisieren, finde ich eigentlich recht interessant :) vill mach ich da mal was schönes ^^
MATHEBUG - Di 07.09.04 22:53
@uall@ogc...
Die Prozedur ist in einem Thread ausgelagert.
Ich muß nur wissen, wie man den Inhalt des Stackes speichern kann.
Denn auch in meiner Hilfe von Delphi 6 finde ich die Befehle für Get und SetThreadContext nicht.
Grüße Mathebug
Delete - Di 07.09.04 23:06
Da wirst du es auch nicht finden, da es Win32API Funktionen sind. Also im PSDK oder online im MSDN kucken.
MATHEBUG - Mi 08.09.04 10:51
Was meinst du mit PSDK und MSDN ?
Des Weiteren hab ich mir die Frage gestellt, wie ich den Thread fortsetzen kann bzw. wie ich dem Progi mitteile, dass der Thread schon läuft und dessen Inhalt sich nun im Speicher befindet ?
Denn dies muß ich ja nach dem Laden aus der Datei, wo ich des gespeichert hab initialisieren.
Welchen Dateityp sollte man denn verwenden ?
Ich glaub, ihr müßt mir das mal alles ganz langsam erklären, weil ich mit Delphi bisher noch nicht so viel gemacht hab.
Danke,
Grüße Mathebug
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!