Zeitsteuerung, aber wie?

Für allgemeine Fragen zur Programmierung mit PureBasic.
neuling
Beiträge: 26
Registriert: 18.10.2007 16:25

Zeitsteuerung, aber wie?

Beitrag von neuling »

Hallo,

ich möchte dass eine Grafik für einen Kurzen Moment angezeigt und nach einer bestimmten Zeit (z.B 1500ms) wieder ausgeblendet wird ohne das mein Programm mit Delay oder wie auch immer Unterbrochen wird (denn wenn eine Grafik angezeigt wird, sollen noch aktionen möglich sein).

Hat da jemand eine Idee?

ps: nutze pb 4
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

Mit ElapsedMilliseconds() kannst du die Zeit messen.
Beispiel:

Code: Alles auswählen

StartTime = ElapsedMilliseconds()
Repeat
  Debug Str(ElapsedMilliseconds()-StartTime)+" ms"
  Delay(100)
Until ElapsedMilliseconds()-StartTime>3000
MessageRequester("Timer","3 Sekunden sind abgelaufen",0)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Im Code Archiv befindet sich auch ein Beispiel zum CPU unabhängigen Programmieren. Also, dass egal wie oft die Schleife durchlaufen wird, "Ticks" in festen Intervallen "gegeben" werden.
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

Das nennt man frameunabhängig programmieren:

http://www.purebasic.fr/german/viewtopi ... abh%E4ngig
neuling
Beiträge: 26
Registriert: 18.10.2007 16:25

Beitrag von neuling »

Hallo,

aha, danke!
Kann ich damit auch irgendwie eine art "Stopuhr" machen wo auch die Millisekunden ständig angezeigt werden? Also eine Art Display von 0 bis unendlich oder was passiert?
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

Code: Alles auswählen

StartTime = ElapsedMilliseconds() 
Repeat 
  Debug Str(ElapsedMilliseconds()-StartTime)+" ms" 
  Delay(10) 
ForEver
Du kannst ja auch auf einem Fenster programmieren. Ist einfach :wink:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
neuling
Beiträge: 26
Registriert: 18.10.2007 16:25

Beitrag von neuling »

Hallo,

ja danke!

Nur mal eine frage zwischendurch, hast du auch eine Prozessorauslastung von 100% wenn du in einer Schleife steckst?
Also auf meinem Laptop AMD 3000+ ~ 1,8 Ghz habe ich eine Auslstung von 100%, auf meinem Arbeitsrechner AMD X2 3800+ haben beide Kerne ca. 50% Auslastung was ja nicht gerade gut ist wenn ich bedenke das HalfLife2 meine Prozessor nicht einmal zu 20% auslastet.....
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@neuling
Ja das ist normal.
Du kannst es in einem Thread machen, dann hast du wieder 0 % CPU-Auslastung.

Beispiel:

Code: Alles auswählen

Procedure Uhr()
  StartTime = ElapsedMilliseconds() 
  Repeat 
    Debug Str(ElapsedMilliseconds()-StartTime)+" ms" 
    Delay(10) 
  ForEver
EndProcedure

OpenConsole() 
  ConsoleTitle("Uhr") 
  CreateThread(@Uhr(),154) 
  Input() 
CloseConsole()
Oder:

Code: Alles auswählen

Procedure Uhr()
  StartTime = ElapsedMilliseconds() 
  Repeat
    ClearConsole()
    PrintN(Str(ElapsedMilliseconds()-StartTime)+" ms")
    Delay(10) 
  ForEver
EndProcedure

OpenConsole()
  EnableGraphicalConsole(1)
  ConsoleTitle("Uhr")
  CreateThread(@Uhr(),154)
  Input()
CloseConsole()
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
neuling
Beiträge: 26
Registriert: 18.10.2007 16:25

Beitrag von neuling »

Hi,

ich meine nicht bei dem ding mit den ms sondern im Allgemeinen, es gibt eigentlich immer nur (wie früher auch bei Qbasic) immer eine Hauptschleife die etwas macht, die lastet die CPU doch voll aus.. oder sehe ich da was falsch?

Und bei dieser Threaderstellung kann ich nur ein Wert mitgeben aber nicht abgrasen oder?
Ich glaube ich checke dass nicht so mit den Proceduren-kramm, ich kenne nur Subs/Function´s...
Kannst mich mal kurz aufklären?
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@neuling
Wenn du Delay() benutzt, dann nicht.
Du kannst jederzeit den Wert des Delay() ändern bzw. erhöhen.
Also wenn du Delay() benutzt, dann wird deine CPU nicht ausgelastet.
Da die Schleife immer eine kleine Pause ablegen muss, bevor sie wieder durchläuft.
Das trift nur zu, wenn du in einem Thread oder in einer Event-Schleife reinmachst.

\\Edit:
@Threadfrage
Das ist richtig, du kannst nur ein Parameter übergeben.
Aber es gibt Alternativen.
Du kannst z.B. mehrere Variablen in einem Parameter übergeben.
Du musst nur mit einem Zeichen (z.B. "|") die Variablen trennen.
Dann zerlegst du im Thread den Parameter wieder.
Und dann hast du wieder deine Parameter.

\\Edit2:
Beispiel:

Code: Alles auswählen

VariableA=1024
VariableB=8
VariableC=64

VariablePack$=Str(VariableA)+"|"+Str(VariableB)+"|"+Str(VariableC)
Debug VariablePack$
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten