Uhrzeit mitlaufen lassen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
dl5ndh
Beiträge: 94
Registriert: 13.05.2008 19:55

Uhrzeit mitlaufen lassen

Beitrag von dl5ndh »

Hallo, ich habe noch die alte Version 3.80 von PureBASIC . Mein Programm hat ein Hauptfenster und man kann mehrere andere Fenster öffnen und wieder schliessen. Ich möchte jetzt die aktuelle Uhrzeit und das Datum auf dem Hauptfenster mitlaufen lassen. Die entsprechende Procedure rufe ich als Thread auf. Die Uhrzeit wird auch angezeigt und läuft auch mit, solange ich im Hauptfenster bleibe. Öffne ich ein anderes Fenster, dann dauert es nicht lange und das Programm stürzt ab.
Gibt es da eine andere Lösung, bzw. kann man das geschickter machen, sodaß das Programm nicht mehr abstürzt, nur weil ich ein anderes Fenster öffne?
Vielleicht kann mir jemand einen guten Tip geben. Vielen Dank schon mal im voraus :)

Hier ist die Procedure, wie ich es halt programmiert habe:

Code: Alles auswählen

;- UHR AKTIVIEREN
Procedure UHR_LAUFEN_LASSEN()
Protected SEKUNDE.s, MINUTE.s, STUNDE.s, TAG.s, MONAT.s, JAHR.s, DATUM.s, WOCHENTAG.b
;UTCdifferenz ist eine globale Variable

; 0 : Sonntag 
; 1 : Montag 
; 2 : Dienstag 
; 3 : Mittwoch 
; 4 : Donnerstag 
; 5 : Freitag 
; 6 : Sonnabend 

        ;
Repeat
          STUNDE=FormatDate("%hh",Date())
          MINUTE=FormatDate("%ii",Date())
          SEKUNDE=FormatDate("%ss",Date())
          DATUM=FormatDate("%dd.%mm.%yyyy",Date())
          WOCHENTAG = DayOfWeek(Date()) 
          
          CreateImage(#Image_UHR,300,135)
          UseImage(#Image_UHR)
          StartDrawing(ImageOutput())
          DrawingMode(1)
          DrawingFont(FontID73)
          Box(0,0,300,135,RGB(255,255,255))
          FrontColor(0,0,0)
          textlaenge=TextLength(STUNDE+" : "+MINUTE)
          Locate((150-(textlaenge/2)),60)
          DrawText(STUNDE+":"+MINUTE)
          StopDrawing()
          SetGadgetState(#IMGadget_UHR,UseImage(#Image_UHR))
ForEver

EndProcedure
__________________________________________________
Code-Tags hinzugefügt
29.11.2018
RSBasic
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Uhrzeit mitlaufen lassen

Beitrag von Kiffi »

dl5ndh hat geschrieben:Hallo, ich habe noch die alte Version 3.80 von PureBASIC .
na, dann mal schnell updaten! :-)
dl5ndh hat geschrieben:Die entsprechende Procedure rufe ich als Thread auf.
kannst Du auch über einen Timer machen (AddWindowTimer()). Ist wesentlich ungefährlicher.

Grüße ... Peter

// Edit: AddWindowTimer() gibt es erst ab Version 4.4. Sorry, das habe ich nicht bedacht.
Hygge
Benutzeravatar
Bisonte
Beiträge: 2430
Registriert: 01.04.2007 20:18

Re: Uhrzeit mitlaufen lassen

Beitrag von Bisonte »

Kiffi hat geschrieben:
dl5ndh hat geschrieben:Hallo, ich habe noch die alte Version 3.80 von PureBASIC .
na, dann mal schnell updaten! :-)
dl5ndh hat geschrieben:Die entsprechende Procedure rufe ich als Thread auf.
kannst Du auch über einen Timer machen (AddWindowTimer()). Ist wesentlich ungefährlicher.

Grüße ... Peter
AddWindowTimer gab es unter 3.81 noch nicht...
Allerdings könnte der Absturz daher kommen, dass du deine Threadprozedur ohne Parameter erstellst.

Es wird immer ein Parameter gebraucht.
Bei CreateThread(@Procedure(), Parameter) wird einer übergeben. Also muss der in der Prozedur auch mit aufgeführt sein.
Das steht allerdings noch nicht in der Hilfe bei PB3.81

Wenn du aus :
Procedure UHR_LAUFEN_LASSEN()
ein
Procedure UHR_LAUFEN_LASSEN(dummy)
ist es schonmal die halbe Miete.

Dann änderst du den Zustand eines Gadgets innerhalb eines Threads. Das sollte man vermeiden.
Ein Sendmessage_() um das an das Fenster zu melden und einen WindowCallBack um das SetGadgetState zu verarbeiten, wäre die
bessere Wahl.
PureBasic 6.10 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
dl5ndh
Beiträge: 94
Registriert: 13.05.2008 19:55

Re: Uhrzeit mitlaufen lassen

Beitrag von dl5ndh »

Hallo!
Vielen Dank für die Mitteilung. Ok, nachdem Du schreibst, dass man den Parameter dringend braucht und auch an das aufgerufene Fenster weitergegeben werden muß, probiere ich dass heute Abend mal aus. Ansonsten müßte ich mich wirklich mal mit den Windows Callbacks auseinandersetzen. Ist auf jeden Fall interessant. Vielen Dank für die sehr interessante Antwort
Gruß
Gerhard
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Uhrzeit mitlaufen lassen

Beitrag von GPI »

Bei Threads beachten: Strings sind nicht Threadsicher - du musst das in den Compileroptionen umstellen. Zudem solltest du ein Delay einbauen und überprüfen, ob sich überhaupt was ändert. Aktuell pinselst du mit maximaler Geschwindigkeit (und Auslastung) eine Uhr, die sich nur jede Minute ändert.
Ein anderer Konfliktpunkt könnte sein, dass es bei Start/StopDrawing mit überschneidungen zum Hauptthread kommt.

Ansonsten könntest du mit PostEvent() ein "Timer" simulieren. Also Thread eröffnen, endlosschleife mit Postevent und Delay(1000) (jede Sekunde). Falls es PostEvent noch nicht gibt, geht auch SendMessage_() (achtung, delay ist ungenau)
Dann kannst du sauber in der Hauptschleife arbeiten.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
dl5ndh
Beiträge: 94
Registriert: 13.05.2008 19:55

Re: Uhrzeit mitlaufen lassen

Beitrag von dl5ndh »

Also da habe ich ja jetzt einige gute Tipps. Hoffentlich finde ich daraus die Lösung. Man gibt nie auf. Vielen
Dank Euch allen für die Antworten :)
Benutzeravatar
dl5ndh
Beiträge: 94
Registriert: 13.05.2008 19:55

Re: Uhrzeit mitlaufen lassen

Beitrag von dl5ndh »

Hallo und noch einmal vielen Dank für Eure Mühe, mir Tipps zu geben :)
Da ich für das alte Programm, welches noch mit der Version 3.81 geschrieben war, nicht die vollen Optionen
zur Verfügung habe, bin ich nun einen riesigen Schritt weitergekommen. Ich bin als erstes Mal Eurem Hinweis
mit der Schleifengeschwindigkeit nachgegangen. Natürlich läuft das Ding vielleicht millionenfach durch, nur
um jeweils um eine Sekunde weiterzutakten. Ich habe in diese Schleife erstmal nur ein Delay von 1000(=1Sekunde)
eingetragen. Ich wollte dann noch für jedes wahlweise zu öffnende Fenster ein PauseThread(irgendwas) und nach dem
Schließen ein ResumeThread(irgendwas) eintragen. Das habe ich erst mal nicht gemacht, weil ich einige zig Fenster
habe, die man auf und wieder zumachen kann. Siehe da, tatsächlich hat allein der Eintrag Delay(1000) soweit
geholfen, dass ich nur ab und zu noch einen Absturz habe. Das bedeutet, ich kann jetzt immerhin 20 Mal irgendein
Fenster öffnen, ohne dass das Programm abstürzt. Den Restteil kriege ich auch noch hin.
Ich habe das Programm aber nur aus dem Quelltexteditor heraus gestartet und getestet, also quasi als "Interpreter".
Wenn ich es compiliere (habe ich noch nicht gemacht), verhält es sich möglicherweise noch günstiger.
Ich wollte Euch das mitteilen, damit Ihr seht, dass mir Eure Informationen sehr geholfen haben. Recht herzlichen Dank
noch einmal.
Gerhard
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

Re: Uhrzeit mitlaufen lassen

Beitrag von ts-soft »

Die Idee von Kiffi fand ich auch gut, bloß das man hier die API nutzen müsste:

Code: Alles auswählen

Procedure TimerProc(hWnd, uMsg, idEvent, dwTime)

  If idEvent = 1
    ; ...
  EndIf
EndProcedure

SetTimer_(WindowID(#WINDOW), 1, 100, @TimerProc())
Hier der Code nur angedeuted.

Gruß
Thomas
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
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Uhrzeit mitlaufen lassen

Beitrag von RSBasic »

Hallo dl5ndh,

ich empfehle dir die neuste PB-Version sehr. Die Version, die du noch verwendest, ist noch aus dem Jahr 2003. :shock:
Das erinnert mich an die Zeit, als STARGÅTE jahrelang noch die alte 3.30-Version benutzt hat, bis er irgendwann endlich auf 4.x umgestiegen ist. :D

Falls du eine Händler-Version benutzt (Media Markt, Ebay, Amazon, ...) und deshalb kein Update-Recht hast, lohnt sich die einmalige Investition von 79 € oder Upgrade von 59 € (DTP) oder 69 € (TOPOS) auf jeden Fall.
Du hast sehr viele neue native Funktionen verpasst, die nach 3.80 dazu kamen. Die komplette Changelog-Liste findest du hier: http://www.purearea.net/pb/german/manua ... story.html
Dann kannst du auch problemlos AddWindowTimer() und viele andere Funktionen verwenden, ohne dass du die Meldung "...() ist keine Funktion, Array, Makro oder LinkedList." bekommst.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
dl5ndh
Beiträge: 94
Registriert: 13.05.2008 19:55

Re: Uhrzeit mitlaufen lassen

Beitrag von dl5ndh »

Ja, das mit der neuen Version stimmt schon. Ich überlege mir das :)
Übrigens meine mitlaufende Uhr konnte ich realisieren. Auch nach dem Öffnen anderer Fenster stürzt nichts mehr ab. Vielen Dank noch einmal allen für die guten Tipps.
Ich würde Euch gerne die Hauptseite meines Logbuchprogrammes zeigen, aber weiß nicht, wie ich hier ein Jpg-Bild hineinbekomme.
RSBasic: Nein nein, ich hatte damals meine Version 3.80 über die Internetseite PB gekauft. Man sagte mir damals, ich kann immer updaten. Das ging auch ein paar Mal gut...bis zur Version 4.5. Ich konnte mich plötzlich nicht mehr mit meinem Passwort einloggen. Als ich nachfragte, schrieb man mir, ich müßte eine neue Version kaufen. Ja, so war das.

Naja, für neue Projekte wäre die neueste PB-Version nicht schlecht, zumal man vielseitiger programmieren kann. Also ich denke jedenfalls drüber nach. An wen muß ich mich bezüglich einer Bestellung denn wenden ?

Gruß Gerhard, DL5NDH
Antworten