Problem mit der Zeit

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

ts-soft hat geschrieben:
AND51 hat geschrieben:Wieso verwendest du für das Datum/die Zeit nicht einfach Date() und FormatDate()?
Weil Du nicht aufmerksam liest :mrgreen:
PureBasic 3.3
Huch! :coderselixir:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Kawentsmann hat geschrieben:@ts-soft: das mit dem Delay() hab ich auch nur zu Testzwecken eingesetzt
Aber genau aus diesem Grund wirds eben nicht jede Sekunde aktualisiert,
sondern nur wenn das OS gerade Zeit hat :mrgreen:

Die Ausgabe sollte in einem TimerCallback erfolgen, unabhängig vom
standard-loop
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Urzeit

Beitrag von kswb73 »

Wenn du deinen Code nicht großartig verändern willst kannst du es auch so machen:

Code: Alles auswählen

time.SYSTEMTIME
Urzeit.s
If OpenConsole()<>0
 Repeat
  GetLocalTime_(time)
  If Not Str(time\wHour)+":"+Str(time\wMinute)+":"+Str(time\wSecond)=Urzeit
  PrintN(Str(time\wHour)+":"+Str(time\wMinute)+":"+Str(time\wSecond))
  EndIf
  Urzeit=Str(time\wHour)+":"+Str(time\wMinute)+":"+Str(time\wSecond)
  last=time
 Until Inkey()<>""
 CloseConsole()
EndIf 
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Wenn du deinen Code nicht großartig verändern willst kannst du es auch so machen:
Wenn man die CPU Power für nichts anderes benötigt :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

CPU schonender

Beitrag von kswb73 »

Code: Alles auswählen

#Genauigkeit=10
time.SYSTEMTIME
Urzeit.s
If OpenConsole()<>0
 Repeat
  GetLocalTime_(time)
  If Not Str(time\wHour)+":"+Str(time\wMinute)+":"+Str(time\wSecond)=Urzeit
  PrintN(Str(time\wHour)+":"+Str(time\wMinute)+":"+Str(time\wSecond))
  EndIf
  Urzeit=Str(time\wHour)+":"+Str(time\wMinute)+":"+Str(time\wSecond)
  last=time
  Delay(#Genauigkeit)
 Until Inkey()<>""
 CloseConsole()
EndIf 
Schonender und Leistungseinstellend
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Kawentsmann hat geschrieben:@bobobo: es liegt also am OS... ich hab nix anderes erwartet xD
wer hat das denn geschrieben? :?
Das Problem sitzt in 99% aller fälle vor dem PC ... dafür gibs hier das
Anfänger-Forum <) Unwissenheit :wink:

Delay() ist nicht dafür zuständig, die exakte übergebene Zeit zu warten,
sondern der übergebende Parameter ist eher die gewünschte Mindestzeit.
Wenn du Delay() aufrufst, wünschst du von deinem PC, das dieser nun
einem anderen Prozess die CPU geben soll. Dabei sagst du ihm noch, wie
lang du nun in deinem Prozess nichts tun möchtest. Das OS ist dafür
zuständig, alle Prozesse auf die CPU (gerecht) zu verteilen.

Jeder Prozess bekommt ein bestimmtes Zeitfenster. Mit Delay() sagst du,
du willst kein Zeitfenster für die nächsten X Millisekunden. Und wenn du
dann wieder eins haben willst, musst du warten, bis das OS dir die CPU
gibt. Für eine zu langsame CPU (oder schlechten Programmierstiel) kann
dein OS nix :wink:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

@kswb73
ich glaub "Not" gibt es in v3.3 noch nicht ;)

@Kawentsmann
dein orginal code läuft bei mir ohne pausen (XP SP2 - 2 minuten testzeit),
ich würde es vom prinzip auch so wie kswb73 machen nur mit STARGÅTE's funktion:

Code: Alles auswählen

Procedure.s Time(string$)
  time$=Space(1000)
  GetTimeFormat_(#LOCALE_USER_DEFAULT,0,0,string$,@time$,1000)
  ProcedureReturn Trim(time$)
EndProcedure

If OpenConsole()<>0
  Repeat
    tmp$ = Time("HH':'mm':'ss")
    If tmp$ <> time$
      time$ = tmp$
      PrintN(time$)
    EndIf
    Delay(100)
  Until Inkey()<>""
  CloseConsole()
EndIf
PureBasic 4.40 (Windows - x86)
Radiate
Beiträge: 114
Registriert: 10.02.2008 16:40
Kontaktdaten:

Beitrag von Radiate »

*haha* Hab exakt das gleiche Prob bei meinem Server. ^^
Jedesmal wenn ein Ereignis Statt findet soll er die aktuelle Zeit davor ausgeben, aber statt dessen gibt er immer die allererste Zeit wieder aus.

Hier mein Code:

Code: Alles auswählen

Date$ = FormatDate("%yyyy/%mm/%dd", Date())
Time$ = FormatDate("%hh:%ii:%ss", Date())
Hier mein Prog (Server):

Code: Alles auswählen

InitNetwork()
If ExamineIPAddresses()
  IP.l = NextIPAddress()
  NextIP = NextIPAddress()
EndIf
*buffer = AllocateMemory(100)

Date$ = FormatDate("%yyyy/%mm/%dd", Date())
Time$ = FormatDate("%hh:%ii:%ss", Date())

If CreateNetworkServer(0, 6654,#PB_Network_TCP)
  OpenWindow(#ComNet_Server,0,0,400,600,"ComNet Server 0.0.1",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered) And CreateGadgetList(WindowID(#ComNet_Server))
  SetWindowCallback(@WindowCallback())
  AddKeyboardShortcut(#ComNet_Server,#PB_Shortcut_Escape,#ComNet_Quit)
  EditorGadget(#ComNet_In,10,10,380,580,#PB_Editor_ReadOnly)
  AddGadgetItem(#ComNet_In,-1,"» "+Date$+" "+Time$+"")
  AddGadgetItem(#ComNet_In,-1,"» Server erfolgreich erstellt!")
  AddGadgetItem(#ComNet_In,-1,"» Server unter folgender TCP/IP erreichbar: " + IPString(NextIP) + ":6654")
  AddGadgetItem(#ComNet_In,-1,"")
  AddGadgetItem(#ComNet_In,-1,"")
  Repeat
    GadgetID = WaitWindowEvent()
    If WindowEvent() = #PB_Event_CloseWindow
      Quit = 1
      close_fadeout(#ComNet_Server)
    EndIf
    Select EventGadget()
      Case #ComNet_Quit
        Quit = 1
        close_fadeout(#ComNet_Server)
    EndSelect
    Select NetworkServerEvent()
      Case 1
        AddGadgetItem(#ComNet_In,-1,"» "+Time$+" Client hat sich eingeloggt!")
        ClientID.l = EventClient()
        remoteip$=IPString(GetClientIP(ClientID))
        AddGadgetItem(#ComNet_In,-1,"» Client hat die IP: "+remoteip$)
      Case 2
        length.l = ReceiveNetworkData(ClientID, *buffer, 100)
        String$ = PeekS(*buffer, 100)
        AddGadgetItem(#ComNet_In,-1,"» Empfang:" + String$)
        SendNetworkData(ClientID, *buffer, 100)
      Case 4
        AddGadgetItem(#ComNet_In,-1,"» "+Time$+" Client hat die Verbindung beendet!")
        ClientID.l = EventClient()
    EndSelect
  Until Quit = 1
EndIf
FreeMemory(*buffer)
End
» PureBasic 4.30
» AMD Athlon II X2 240 | 2048 RAM | Win XP SP 3
» Projekt(e): Fusion (eingestellt), SAS (eingestellt), Moviez
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Date() gibt die aktuelle Zeit aus. Wenn du das ding nur ein mal vor deiner
Schleife aufrufst, holst du auch nur ein mal die aktuelle Zeit.

Um also jedes mal wieder die aktuelle Uhrzeit angezeigt zu bekommen,
brauchst du keine Variablen, sondern nutzt direkt

Code: Alles auswählen

FormatDate("%hh:%ii:%ss", Date())
dort, wo du jetzt die Variablen nutzt.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten