Timer Callback... wie gehts?
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Timer Callback... wie gehts?
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.
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.
Der Weise weiß, dass er ein Narr ist.
kennste schon ?
http://www.purebasic-lounge.de/viewtopi ... k+tutorial
http://www.purebasic-lounge.de/viewtopi ... k+tutorial
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?
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
@#Null
wenn ich ProcedureReturn 0 verwende, verhindere ich ja damit (sofern es windows erlaubt) dass die message überhaupt vom system verarbeitet wird:
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?
edit: in den callback verpackt:
c ya,
nco2k
bitte wie?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."
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
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)
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
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
@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.
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.
Der Weise weiß, dass er ein Narr ist.
<OT>
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
ohne jetzt hier wieder eine endlose Diskussion lostreten zu wollen möchte ichKaeru 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.
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²
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> 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.
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.
Der Weise weiß, dass er ein Narr ist.
ist Dir wahrscheinlich entfallen. Du hast Dich an diesem Thread beteiligt.Kaeru Gaman hat geschrieben:hab ich garnicht gesehen.
das sehe ich in Hinsicht auf den Ort, wo die Kritik ausgeübt werden soll, alsKaeru Gaman hat geschrieben:aber: deine Lib ist eine Lib, und kein tutorial in einem thread.
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.

Grüße ... Kiffi
a²+b²=mc²
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> 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.
Send(#BACK_TO_TOPIC)
wie ist das nun mit einem Timer-Callback alle 10 oder 20 millisekunden?
ich werde mich bemühen.
schließlich hast du recht mit diesem hinweis.

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.
Der Weise weiß, dass er ein Narr ist.
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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
die meldung "timer-call blocked" erscheint nie, somit wird eine callback-routine nur einmal zur zeit aufgerufen.
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
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.
Der Weise weiß, dass er ein Narr ist.