Autor |
Beitrag |
MATHEBUG
Hält's aus hier
Beiträge: 15
|
Verfasst: So 05.09.04 22:33
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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: 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
Delphi-Quelltext
bzw.
etwas
wie
Delphi-Quelltext
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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
Hält's aus hier
Beiträge: 15
|
Verfasst: 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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 08.09.04 11:42
MSDN: www.msdn.microsoft.com
PSDK: www.microsoft.com/ms...atformsdk/sdkupdate/
Und was deine anderen Probleme angeht: Du musts da ziemlich tief in die interna von Windows eingraeifen und davon ist immer abzuraten. Such lieber nach einer anderen Lösung, auch wenn diese bedingt, dass du den ganzen Algorithmus umschreiben musst.
|
|