Uhrzeit in der Statusbar anzeigen

Anfängerfragen zum Programmieren mit PureBasic.
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Uhrzeit in der Statusbar anzeigen

Beitrag von TheSaint »

Hallo Zusammen,

könnte mir bitte jemand auf die Sprünge helfen, was ich hier falsch mache?

Ich möchte in einer Statusbar die aktuelle Zeit anzeigen lassen.

Code: Alles auswählen

Procedure Zeit()
  Repeat
    zeit$=FormatDate("%hh:%ii:%ss", Date())
    StatusBarText(#StatusBar_0, 0, zeit$, #PB_StatusBar_Center)
    Delay(1000)
  ForEver
EndProcedure

Open_Window_0()
CreateThread(@Zeit(), "")
Bei CreateThread(@Zeit(), "") kommt immer die Fehlermeldung:
Falscher Parameter Typ, Zahl anstelle eines Strings erwartet.

Habe schon in der Hilfe gesehen und im Board gesucht.
Kriegs einfach nicht hin.

Wäre toll, wenn mir jemand helfen könnte.

Vielen Dank schon mal und viele Grüße
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

Erstens solltest du ein besseres Beispiel parat haben als diesen Schnipsel,
denn daraus kann man wenig lesen. Es gibt weder Open_Window_0() oder
#StatusBar_0, aber das ist ja nicht dein Problem.

Zweitens brauchst du doch dafür keinen Thread, oder?
Win11 x64 | PB 6.20
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

Code: Alles auswählen

If OpenWindow(0, 0, 0, 200, 200, "StatusBar Zeit")
  CreateStatusBar(0, WindowID(0))
    AddStatusBarField(100)

  Repeat
    StatusBarText(0, 0, FormatDate("%hh:%ii:%ss", Date()))
    
    event = WaitWindowEvent(1)
  Until Event = #PB_Event_CloseWindow
EndIf
@TheSaint
Delay(1000) laß mal besser, das hält Dein Programm immer für eine Sekunde vollständig an.
Zuletzt geändert von THEEX am 26.12.2008 11:49, insgesamt 1-mal geändert.
Eine Art Query-Planner soll die Ausführung von Map/Reduce-Funktionen in Hadoop stark beschleunigen.
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo Andesdaf,

danke für Deine Nachricht.
Sorry, dass ich anscheinend zu wenige Informationen gegeben habe.

Es ist einfach so, dass ich hiermit die laufende Uhrzeit unten
in einer StatusBar anzeigen möchte.
Leider komme ich über diese Fehlermeldung nicht hinaus weg.

Dachte man braucht dazu einen Thread...

Bin halt Anfänger. Sorry

Trotzdem vielen Dank.

Viele Grüßé
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo THEEX,

vielen Dank für Deine Hilfe und Deinen Tipp.
Funktioniert super.

Schönen Tag noch und viele Grüße
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

ich persönlich würde es über einen Timer machen. Dann wird
StatusBarText() nur einmal pro Sekunde aufgerufen und nicht jedes Mal,
wenn der WaitWindowEvent()-Timeout abgelaufen ist.

Code: Alles auswählen

Procedure ShowTime(hwnd, uMsg, idEvent, dwEvent)
    StatusBarText(0, 0, FormatDate("%hh:%ii:%ss", Date()))
EndProcedure

If OpenWindow(0, 0, 0, 200, 200, "StatusBar Zeit")
  
  CreateStatusBar(0, WindowID(0))
  AddStatusBarField(100)
  
  SetTimer_(WindowID(0), 0, 1000, @ShowTime()) ; und dann nur noch jede Sekunde
  
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow
  
EndIf
Grüße ... Kiffi

// Edit: ShowTime() um 4 Parameter erweitert.
Zuletzt geändert von Kiffi am 26.12.2008 14:38, insgesamt 2-mal geändert.
a²+b²=mc²
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

der Gedanke mit dem Thread war schon mal grundsätzlich nicht schlecht.
dein problem war, dass er , wie er sagte, eine zahl will keinen string.
außerdem solltest du auch bei der Prozedurdefinition ein Dummy-Argument einsetzen.

also

Code: Alles auswählen

Procedure Zeit( dummy.l ) 
;...
CreateThread(@Zeit(), 0 )

das kannst du ruhig nochmal probieren, damit du's mal zum laufen gebracht hast,
auch wenn du's nachher anders machst. ;)


das was Kiffi hier vorgestellt hat, ist ein Callback, hier mit einem Timer.
das ist für sowas tatsächlich die günstigste vorgehensweise.
hierbei läuft der Nebenprozess nicht permanent, sondern nur bei bedarf.

beim Einrichten sagt man dem Betriebssystem gleichsam, "wenn dasundas eintritt, ruf mich zurück"
in diesem Fall ist das Ereignis ein timer, und der Zurückgerufene die Proc ShowTime()


die von EX vorgeschlagene Lösung funktioniert natürlich auch,
die hat in anderen Anwendungsbereichen ihren Vorteil.
z.B. bei permanenten Animationen, wie Aktualisierungen von Graphen,
oder aber bei Games im WindowedScreen.


... hoffe, die Backgroundinfos haben das ganze noch etwas aufgeklärt.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

auf das einfachste kommt man nicht, einfach ein dummes Argument einsetzen
und schon kein Problem mehr...

man lernt immer dazu... :wink:
Win11 x64 | PB 6.20
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 »

Noch ein Hinweis zu Kiffis Beispiel: TimerCallback hat 4 parameter, diese
sollten auch vorhanden sein, egal ob genutzt oder nicht. Früher oder später
gibts nen Crash, weil die parameter ins Nirwana gesendet werden.
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
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

ts-soft hat geschrieben:Noch ein Hinweis zu Kiffis Beispiel: TimerCallback hat 4 parameter
ja, vergesse ich immer wieder. ;-)
Habe es oben korrigiert. Danke für den Hinweis!

Grüße ... Kiffi
a²+b²=mc²
Antworten