AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Daten synchronisieren
Thema durchsuchen
Ansicht
Themen-Optionen

Daten synchronisieren

Ein Thema von Crayser · begonnen am 19. Jan 2003 · letzter Beitrag vom 26. Feb 2003
Antwort Antwort
Seite 1 von 2  1 2      
Crayser

Registriert seit: 26. Dez 2002
9 Beiträge
 
#1

Daten synchronisieren

  Alt 19. Jan 2003, 16:28
Hallo zusammen
ich habe 2 programme; server und client. nun will ich das der server nach einer gewissen zeit einige Variablen zum Client sendet.

Code:
//Code vom Server
procedure TForm1.Timer2Timer(Sender: TObject);
var Leftstr:string;
begin
Leftstr:=inttostr(Schlaeger.Left);
ServerSocket1.Socket.Connections[0].SendText('4'+Leftstr);

//Code vom Client
empfang := ClientSocket1.Socket.ReceiveText; //client empfängt
choose:= strToInt(empfang[1]);

case choose of
1: ..
2: ..
3: ..
4: begin for i:=2 to length(empfang) do
         temp[i-1]:=empfang[i];
      SchlaegerKopf.Left:=strtoint(temp);
   end;
Das Programm kann fehlerfrei compiliert werden, doch wenn der delay von timer2 zuende ist, wird das Programm mit einem Fehler abgebrochen.

Danke für jegliche Hilfe.
Ciao Crayser
  Mit Zitat antworten Zitat
Crayser

Registriert seit: 26. Dez 2002
9 Beiträge
 
#2
  Alt 20. Jan 2003, 15:21
Ich habe noch die Fehlermeldung in den Anhang gesetzt. Kann mir jemand sagen was da nicht stimmen könnte?
Wenn ihr wollt, kann ich die source vom client und server noch uploaden. Doch an anderen Stellen im source dürfte der Fehler nicht liegen.

ciao Crayser
Miniaturansicht angehängter Grafiken
fehler.jpg   fehler.jpg  
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 22. Jan 2003, 19:59
Moin Crayser,

möglicherweise tritt der Fehler auf, beim Zugriff auf empfang[1].
Nachdem ReceiveText ausgeführt wurde, solltest Du, sicherheitshalber, prüfen, ob empfang überhaupt Daten enthält.

Ich weiss jetzt zwar nicht, wie gross das Intervall bei Deinem Timer2 ist, aber es könnte sinnvoll sein, die Routine mit einem Timer2.Enabled := false zu beginnen, und mit einem Timer2.Enabled := true zu beenden, damit sich verschiedene Timeraufrufe nicht gegenseitig überholen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Crayser

Registriert seit: 26. Dez 2002
9 Beiträge
 
#4

Kein Erfolg

  Alt 24. Jan 2003, 16:50
Hi Christian

die Fehler liegen nicht an den anderen case Befehlen. Der case Befehl ist eigentlich aus if empfang=1 .. else if empfang=2 .. etc. audgebaut. Deshalb sind die Anweisungen unabhängig voneinander. Bei den 3 anderen case Befehlen läuft alles gut.

Timer2 ist nicht sehr lang; habe es trotzdem mit dem dis/enable probiert.. ohne Erfolg. Trotzdem Danke. Das timing Intervall ist auch sehr lang (macht keinen Unterschied in welchen Zeitabständen der timer aufgerufen wird).
Wie gesagt wenn du willst, kann ich den ganzen code uploaden doch ist er noch nicht fertig, da ich noch einige andere Sachen vorschieben muss. Das Programm(ist übrigens nen Spiel) ist trotzdem startbar.

ciao Crayser
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 24. Jan 2003, 18:17
Moin Crayser,

geh' doch mal im Einzelschritt durch das Programm (F7/F8) und versuch' mal dadurch die Fehler erzeugende Stelle zu finden.
Am Besten vor der verdächtigen Stelle einen Breakpoint setzen, und dann weiter im Einzelschritt.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Crayser

Registriert seit: 26. Dez 2002
9 Beiträge
 
#6
  Alt 25. Jan 2003, 10:48
Code:
 temp[i-1]:=empfang[i];
Hallo Christian,
beim debuggen bleibt er an diesem code hängen. ich persönlich kann da aber keinen fehler erkennen. beide variablen sind strings, ich kopiere bis auf das erste zeichen den ganzen inhalt von empfang in temp. i ist in einer for schleife die bis length(empfang) läuft.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#7
  Alt 25. Jan 2003, 11:02
Mit welchem Wert beginnt die Schleife denn? Nach dem, was du geschriebenn hast, müsste sie mit i=2 beginnen.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Crayser

Registriert seit: 26. Dez 2002
9 Beiträge
 
#8
  Alt 25. Jan 2003, 14:48
Ah ich hab den Fehler gefunden. Ich hatte die Größe der strings nicht deklariert und daher kam der Fehler. Jetzt ist es aber nun ziemlich unpraktischt, da ich das Ende von temp bestimmen muss. Je nachdem wie groß der integerwert von empfang ist, variiert das ende von temp. Gibt es da einen eleganteren Weg, als alle (bzw. die Endwerte) von temp vorher auf #0 zu setzen?
Danke für die Tipps Christian.

ja die Schleife hängt mit i=2 an, da bei empfang[1] nur der Wert für die case Anweisung ist bei i=2 bis ende hab ich dann die info, die der server an den clienten weitergeben soll.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 25. Jan 2003, 18:04
Moin Crayser,

hast Du jetzt temp : string[...] deklariert?
Das wäre dann ein ShortString.

Die Länge initalisieren ginge, z.B., mit SetLength, oder auch einer Zuweisung von StringOfChar.
Wie gross temp dabei wird kannst Du dann ja anhand der Länge von empfang festlegen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Crayser

Registriert seit: 26. Dez 2002
9 Beiträge
 
#10
  Alt 3. Feb 2003, 11:38
Hallo Christian
wird dann die Länge des Strings dynamisch geregelt? Also kann ich dann getrost die Auffüllung mit #0 weglassen wenn ich die Länge mit SetLength deklariere? Muss ich mal ausprobieren.

Nun hab ich aber ein anderes Problem, wo ich noch nicht so schnell eine Lösung finden konnte. Und zwar will ich gleich mehrere Informationen aufeinmal per Netzwerk senden. Jedoch ist sendText bzw. ReceiveText (ich weiss nicht genau welche die Probleme bereitet) bei mehreren Aufrufen hintereinander ziemlich problematisch, da (ich vermute) die case Anweisung noch nicht zuende gearbeitet werden konnte bevor der Client schon eine neue Anweisung erhält.
Da dachte ich mir ich sende gleich alle Informationen auf einmal in einem String. Was mein Problem ist könnt ihr euch ja denken. Wie kann ich die Befehlsinformationen auseinanderhalten (bzw. unterscheiden wo das Ende und wo der Anfang der nächsten Information ist). Die Länge variiert.

Deshalb bringt mir ..SendText(Info1+Info2+..) nichts, da ich nicht genau weiss ab wann/wo die zB Info2 beginnt. Ich dachte mir das man irgendwelche speziellen Zeichen als Indikator für das Ende der Strings machen könnte doch weiss ich nicht wie ich es ins Programm umsetzen kann. Habt ihr/hast du eine Idee?

Ciao Crayser

P.S.: Sorry, das ich so lange nicht zurückgeschrieben hab, die Zeit ist bei mir im Moment ziemlich knapp.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz