Timer Callback... wie gehts?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Timer Callback... wie gehts?

Beitrag von Kaeru Gaman »

Hi Leute,

ich hab noch nie mit Callbacks gearbeitet, wird wohl langsam zeit.

ich würde gern ne Game-aktualisierungs-schleife in nen timer-callback packen,
um ihn von der grafik schleife, die sich nach der framerate richtet, unabhängig zu machen.
(windowed-screen, also win-oberfläche)

könntet ihr mir n kurzes code-snippet posten, wie so ein call back mindestens aussehen muss?

und ich hab noch fragen....

- ist der timer genau genug, um die routine alle 20 oder sogar nur 10 ms aufzurufen?
- läuft der parallel oder ausschließlich? also, muss ich mittels flag sicherstellen,
dass nur eine instanz der callback-routine zur zeit laufen kann,
oder ist das grundsätzlich ausgeschlossen?

danke im voraus.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Danke! Dank dem Turoial habe ich Callbacks weitestgehend verstanden.
Aber wie der eine schon fragte: Warum soll das abarbeiten der Events in einem Callback besser sein?

Ah, genau: Vieleicht, weil man mit Hilfe von Callbacks die Hauptschleife überflüssig machen kann, wärehnd man den restlichen Code, der hinter den Knöpfen, Hebeln, und Slidern steckt auch in Proceduren verbannt? OK. Aber was soll dann daran besser sein, die Performanz?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

@#Null
Hroudtwolf hat geschrieben:"Der Rückgabewert #PB_ProcessPureBasicEvents sollte nur zurückgegeben werden wenn kein Ereignis vom Callback verarbeitet wurde.
Nachdem ein Ereignis vom Callback verarbeitet wurde sollte stets ProcedureReturn 0 zurückgegeben werden."
bitte wie?

wenn ich ProcedureReturn 0 verwende, verhindere ich ja damit (sofern es windows erlaubt) dass die message überhaupt vom system verarbeitet wird:

Code: Alles auswählen

Procedure WndProc(hWnd, uMsg, wParam, lParam)
  If uMsg = #WM_SYSKEYDOWN And wParam = #VK_MENU
    ;ProcedureReturn 0
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

If OpenWindow(0, 0, 0, 200, 200, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@WndProc())
  While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
EndIf : End
1.) drücke die linke alt taste
2.) lasse die linke alt taste los
3.) drücke die pfeiltaste unten

du wirst sehen, dass das sysmenu aufpopt, wenn du aber ProcedureReturn 0 auskommentierst, wird das nicht mehr gehen. die alt taste wurde dann praktisch nie gedrückt.

@Kaeru Gaman
hilft dir dieses beispiel von ts-soft weiter?

Code: Alles auswählen

If OpenWindow(0, #PB_Ignore, 0, 200, 200, "Test")

  SetTimer_(WindowID(0), 0, 5000, 0)
  
  Repeat
    Select WaitWindowEvent()
      
      Case #PB_Event_CloseWindow
        Break
        
      Case #WM_TIMER
        Debug "Schon wieder 5 Sekunden um"
    
    EndSelect
  ForEver
EndIf

KillTimer_(WindowID(0), 0)
edit: in den callback verpackt:

Code: Alles auswählen

Procedure WndProc(hWnd, uMsg, wParam, lParam)
  If uMsg = #WM_TIMER
    Debug "Schon wieder 2 Sekunden um"
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

If OpenWindow(0, 0, 0, 200, 200, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  SetWindowCallback(@WndProc())
  SetTimer_(WindowID(0), 0, 2000, 0)
  While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
EndIf : End
c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@nco2k

danke für dein mini-beispiel.

jetzt fehler noch die antworten auf meine zusatzfragen:
wie siehts mit dem timing und möglichen überschneidungen aus.


btw:
wolfs artikel hättest du dort kritisieren können, wo es hingehört: in der lounge selber.
ich finde das nicht sehr gelungen, das hier zu machen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

<OT>
Kaeru Gaman hat geschrieben:wolfs artikel hättest du dort kritisieren können, wo es hingehört: in der lounge selber.
ich finde das nicht sehr gelungen, das hier zu machen.
ohne jetzt hier wieder eine endlose Diskussion lostreten zu wollen möchte ich
dennoch anmerken, dass auch in der Lounge Kritik an Produkten von
Board'lern geübt wurde / wird (im speziellen Fall: Meine MSXML-Lib sei zu
kompliziert), ohne dass Du mit einem ähnlichen Kommentar darauf reagiert
hast.

</OT>

Grüße ... Kiffi
a²+b²=mc²
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> ohne jetzt hier wieder eine endlose Diskussion lostreten zu wollen

schwierig


> ohne dass Du mit einem ähnlichen Kommentar darauf reagiert
hast.

hab ich garnicht gesehen.

aber: deine Lib ist eine Lib, und kein tutorial in einem thread.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Kaeru Gaman hat geschrieben:hab ich garnicht gesehen.
ist Dir wahrscheinlich entfallen. Du hast Dich an diesem Thread beteiligt.
Kaeru Gaman hat geschrieben:aber: deine Lib ist eine Lib, und kein tutorial in einem thread.
das sehe ich in Hinsicht auf den Ort, wo die Kritik ausgeübt werden soll, als
irrelevant an.

Egal: Ist ja auch OK, dass Du nco2k drauf hinweist, dass seine Kritik in der
Lounge besser aufgehoben ist. Wäre aber auch nett, wenn Du in der Lounge
genauso umgekehrt verfahren würdest. :allright:

Grüße ... Kiffi
a²+b²=mc²
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Wäre aber auch nett, wenn Du in der Lounge genauso umgekehrt verfahren würdest.

ich werde mich bemühen.
schließlich hast du recht mit diesem hinweis. :wink:


Send(#BACK_TO_TOPIC)

wie ist das nun mit einem Timer-Callback alle 10 oder 20 millisekunden?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

durch #NULL auf den Lounge-thread hingewiesen hab ich auch dort gefragt.
ich hoffe, dass wird nicht zusehr als "parallelfrage" angesehen.

inzwischen sind meine fragen beantwortet, endgültig auch durch einen kleinen test meinerseits:

http://www.purebasic-lounge.de/viewtopi ... 7894#37894

Code: Alles auswählen

Global Timer_Active.l

Procedure WndProc(hWnd, uMsg, wParam, lParam) 
  If uMsg = #WM_TIMER 
    If Timer_Active = 0
      Timer_Active = 1

      Debug "** timer-call execution started"
      Delay(1000)
      Debug "** timer-call execution ended"
      
      Timer_Active = 0
    Else
      Debug "timer-call blocked"
    EndIf
  EndIf 
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure 

If OpenWindow(0, 0, 0, 200, 200, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 

  SetWindowCallback(@WndProc()) 
  SetTimer_(WindowID(0), 0, 200, 0) 

  While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend 
EndIf

End
die meldung "timer-call blocked" erscheint nie, somit wird eine callback-routine nur einmal zur zeit aufgerufen.
Zuletzt geändert von Kaeru Gaman am 07.09.2006 16:18, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten