Autor Beitrag
MATHEBUG
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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



BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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);

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Di 07.09.04 21:15 
nehmen wir mal folgende sinnlose rekursion an:


ausblenden 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

ausblenden Delphi-Quelltext
1:
bla(1);					


bzw.

etwas
wie

ausblenden Delphi-Quelltext
1:
2:
bla(i+3)
bla(i+1)


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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: 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



BeitragVerfasst: 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.