AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Server-Client Spiel : Datenspeicherung

Ein Thema von NickelM · begonnen am 21. Apr 2011 · letzter Beitrag vom 21. Apr 2011
Antwort Antwort
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#1

Server-Client Spiel : Datenspeicherung

  Alt 21. Apr 2011, 07:56
Hallo zusammen,
ich arbeite gerade daran ein kleines "Broswer-" bzw. Serverbasierendes Spiel zumachen.
Da ich mich mit NonVCL net so auskenne, läuft des alles über VCL Komponenten.

So zum Speichern der Daten dachte ich mir, dass ich für den Spieler, der auf dem Server registiert ist eine Datei anlege. In der Speicher ich alles wichtige. Das PW (natürlich ein bischen decoded) usw...

Zur Zeit läuft die Speicherung der Daten ohne Threads. Ich bin am überlegen, wenn ich sie einbaue wie es am besten wäre.
Beim start des Servers wird in einem Verzeichnis nach allen Dateien mit einer bestimmsten endeung gesucht. Der Benutzername ist das Dateiname. Mit TFileStream lade ich alle Daten rein, weil ich es dann so machen will, wenn Daten geändert werden. z.b. die Charakterstats oder so, gebe ich die Streams nicht frei sondern übergebe es an eine Liste, wo auch intern alle Daten gespeichert sind.
Wenn ich jetzt was ändere, schreibt der "Listeneintrag" sozusagen die Daten in die Datei. Da ich auch teilweise mitten in die Datei was einfüge, muss ich ja alles, was nach der Position ist wo ich es einfügen will, erst in eine Variable speichern und dan dranhängen.
So jetzt kommt, unabhängig ob ich das mit Threads mache je Datei oder nicht, das Problem vllt, das der server beendet wird, genau in dem Moment, wenn er was einfügen will und dadurch die Datei beschädigt ist von dem jeweiligen Spieler, oder irre ich da?

Das nächste Problem vor dem ich stehe, ist wie ich es mit Threads umsetzen soll.
Klar ist je Datei einen, nur was geschrieben wird ist ja Unterschiedlich also wie erstellen?

Ich mach mir deshalb diese Gedanken, da ich vorraus denke, zumindest was das getrifft
Zur Zeit ist eine Datei nur knapp 200 Byte groß, da sind ja auch nur größtenteils dei Grundlegenden Sachen drin, wie PW, Charakter und Berufe. Dazu kommen ja dan noch jedes Gebeude was vllt je Gebeude 10- 30 Byte sind oder so. Dann das Lager usw...

Vllt ist ja die Überlegung bei wowenig Speicher auch völlig unsinnig, weis es ja net. Da ich noch net so viel mit Dateienverwaltung zutun hatte, zumindest die ich selbst Byte für Byte erstelle...
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Server-Client Spiel : Datenspeicherung

  Alt 21. Apr 2011, 08:57
Naja du hast ja mehr oder weniger in der Hand wann das Programm beendet wird/werden darf.

Das Formular hat ein Event "OnCloseQuery". Darin kannst du die Variable "CanClose" auf false setzen um zu verhindern, dass das Programm geschlossen werden kann (per Taskmanager/Prozess beenden kriegt man es natürlich trotzdem noch abgeschossen...).

Du könntest dir merken ob du gerade am Speichern bist oder nicht und je nachdem CanClose setzen...

Bsp:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    FBenutzerWillBeenden: Boolean;
    FImSpeichern: Boolean;
  public
    procedure Speichern;
  end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if not (FBenutzerWillBeenden) then
    FBenutzerWillBeenden := true;
  CanClose := not FImSpeichern;
end;

procedure TForm1.Speichern;
begin
  if not FBenutzerWillBeenden then
  begin
    FImSpeichern := true;
    try
      // In Ruhe speichern
    finally
      FImSpeichern := false;
    end;
  end
  else
    Close;
end;
PS: Bin mir nicht sicher obs 100%ig optimal ist, aber ist schonmal ein Ansatz. Wenn der Benutzer das Programm beenden will und er speichert gerade, dann würde das Programm NUR beendet werden wenn der Benutzer das Programm nochmal beenden will (also auf das X klickt) oder wenn das Spiel versucht nochmal zu speichern.

Man könnte auch (noch) folgendes machen:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if (FBenutzerWillBeenden and not FImSpeichern) then
    Close;
end;
Wobei das etwas unschön aussieht...

Musst mal schauen was du mit meinem Text hier anfangen kannst
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Server-Client Spiel : Datenspeicherung

  Alt 21. Apr 2011, 09:56
An CloseQuery hab ich auch gedacht aber wie du schon gesagt hast, mit Taskmanager abschiessen geht trotzdem...aber nun ja das abzuhalten ist ne andere sache...macht man ja auch net...ich will halt nur vermeiden das man es so schliesst und da wäre sowas halt doch gut. Dann müsste ich wohl davor er speichert auf true setezen und dan bei fertig auf false (wenn ich deine Variable als beispiel nehme)

hmm gut das problem wäre soweit gelöst. Nur bei mehrern Spielern ohne Threads ist halt doof....hat jemand da einen Denkanstoß?
Weil ich wollt dass alle Speicheroperationen über Threads gehen. Nur immer vorm speichern einen Thread zuerstellen und wieder freigeben wäre auch doof oder?

Gibt da auch eine elegantere Möglichkeit?
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Server-Client Spiel : Datenspeicherung

  Alt 21. Apr 2011, 10:10
Hallo,

Warum willst du das Speichern überhaupt in Threads haben?
Und ich habe das Gefühl du speicherst verdammt oft o.o

Kannst du nicht einfach beim Beenden des Spiels 1x speichern?
Ansonsten (wenns unbedingt so oft sein muss), dann würde ich 1 Thread erstellen, der dann in gewissen Abständen einfach eine ganze Liste von Spielern durchgeht und deren Spielstände speichert.

Prinzipiell wird dein Programm eh nicht beendet bevor nicht alle Threads beendet sind. D.h. solange dein Speicher-Thread läuft, läuft auch dein Programm noch (es sei denn es wird wie gesagt abgeschossen...). Beim beenden sagst du dem Thread einfach er soll sich bei nächster Gelegenheit beenden. Dann speichert der Thread noch ne Runde, beendet sich dann und das Programm schließt sich.

Soweit die Theorie^^
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Server-Client Spiel : Datenspeicherung

  Alt 21. Apr 2011, 11:45
Naja hört sich gut an..mit dem oft speichern ist halt weil ich Datenverlust durch beenden vom Server vermeiden wollte. Deshalb wollte ich wenn sich was ändert, das er das direkt in die Datei schreibt...aber nur ein Thread dafür in einem Bestimmt Zeitabstand wäre natürlich auch gut. Naja ich danke dann mal für die Überlegung. Ich gug mal wie ich das mit einem Thread am besten hinbekomme...
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:17 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