Timer Callback... wie gehts?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Was bitte, ist ECECUTION? :mrgreen:
nco2k hat geschrieben:wenn ich ProcedureReturn 0 verwende, verhindere ich ja damit (sofern es windows erlaubt) dass die message überhaupt vom system verarbeitet wird:
Toll! Das wirft meinen religiösen Glauben an :praise: CallBacks wieder über den Haufen!


Soll das heißen, Callbacks sind nur dazu da, damit ich mein eigenes Programm manipulieren kann und bestimmen kann, welche Events durch WindowEvent() abgefragt werden können? Abgesehen davon hat ja auch niemand auf meine obige Frage geantwortet.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Was bitte, ist ECECUTION?

ein tippfehler, auch liebevoll "Typo" genannt... :mrgreen:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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 »

>> - ist der timer genau genug, um die routine alle 20 oder sogar nur 10 ms aufzurufen?
Ohne besondere Maßnahmen ist unter NT-Systemen eine Genauigkeit von
10ms, unter Win9x von 56ms

Angeben kann man aber bereits 1 ms

Mit den Timer-Funktionen in der PBOSL_Timer UserLib erreichste eine etwas
höhere Genauigkeit, da dort der Timer als HighRes-Timer initialisiert wird.
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ja, das weiß ich, ich meinte, ob der timer, der den callback steuert, auch den hires-timer verwenden kann, oder auf die 10ms-grenze angewiesen ist...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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 »

Es ist immer derselbe Timer, nur anders initialisiert. Kannste auch selber
machen. MSDN und PSDK geben auskunft. Der in PBOSL ist eben nur am
einfachsten zu nutzen, ohne viel lesen :mrgreen:
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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Es ist immer derselbe Timer, nur anders initialisiert.

also, nochmal zur sicherheit.

wenn ich den Hires-Timer initialisiere,
danch kann ich genauso wie gehabt den Timer-Callback einrichten,
und der nutzt den Hires-Timer?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
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 »

>> also, nochmal zur sicherheit.
Ja, aber zur Sicherheit in PSDK und MSDN nachlesen, mein engl. ist nicht so
gut :mrgreen:
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
nco2k
Beiträge: 892
Registriert: 08.09.2004 23:13

Beitrag von nco2k »

@Kaeru Gaman
Kaeru Gaman hat geschrieben:@nco2k
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.
sry aber ich melde mich nicht deswegen extra dort an. wenn ich bereits dort mitglied gewesen wär, hätte ichs dort auch gemacht, empfand es jedoch nicht als sonderlich schlimm, es einfach mal hier zu posten, immerhin wurde die frage auch hier gestellt.

@AND51
AND51 hat geschrieben: Soll das heißen, Callbacks sind nur dazu da, damit ich mein eigenes Programm manipulieren kann und bestimmen kann, welche Events durch WindowEvent() abgefragt werden können?
nein, es gibt viele möglichkeiten. du kannst u.a. auch bestimmte vorkehrungen treffen, bevor das benötigte event verarbeitet wird. kleines beispiel: jedesmal bevor das vollbild screen minimiert wird sollen alle sprites mittels einer schleife gefreet werden und jedesmal bevor das screen wieder restored wird, sollen alle sprites wieder neu eingelesen werden. ich weiss pb macht dies im regelfall automatisch, ist auch jetzt einfach nur als beispiel hergeholt.

allerdings sollte man sich ganz genau überlegen welche befehle man innerhalb eines callbacks verwendet und "manuell" abarbeitet, da befehle, welche weitere msgs ausgeben, nette endlosschleifen verursachen können:

ACHTUNG: benützung auf eigene gefahr

Code: Alles auswählen

Procedure WndProc(hWnd, uMsg, wParam, lParam)
  If hWnd = WindowID(0) And uMsg = #WM_SIZE
    Select wParam
      Case #SIZE_MINIMIZED
        ShowWindow_(hWnd, #SW_RESTORE)
      Case #SIZE_RESTORED
        ShowWindow_(hWnd, #SW_MINIMIZE)
    EndSelect
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

If OpenWindow(0, 0, 0, 200, 200, "Test", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  SetWindowCallback(@WndProc())
  While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
EndIf
wenn du in dem beispiel z.b. den minimieren button des fensters clickst, wird die #SIZE_MINIMIZED msg verarbeitet nachdem das fenster minimiert wurde und das fenster wieder restored, was jedoch die #SIZE_RESTORED hervorruft und in dieser wird dann das fenster wieder minimiert, was wiederrum eine #SIZE_MINIMIZED msg ausgibt was somit zu einer endlosschleife führt. ProcedureReturn #False funktioniert hier natürlich nicht.

du kannst auch einfach den minimieren und den maximieren knopf frech vertauschen, dafür ist ja das ProcedureReturn #False da:

Code: Alles auswählen

Procedure WndProc(hWnd, uMsg, wParam, lParam)
  If hWnd = WindowID(0) And uMsg = #WM_SYSCOMMAND
    Select (wParam & $FFF0)
      Case #SC_MINIMIZE
        ShowWindow_(hWnd, #SW_MAXIMIZE)
        ProcedureReturn #False
      Case #SC_MAXIMIZE
        ShowWindow_(hWnd, #SW_MINIMIZE)
        ProcedureReturn #False
    EndSelect
  EndIf
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

If OpenWindow(0, 0, 0, 200, 200, "Test", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
  SetWindowCallback(@WndProc())
  While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend
EndIf
callbacks sind für viele sachen nützlich, die möglichkeiten sind praktisch endlos, pauschalisieren kann man es nicht und jeder muss sich überlegen für was er die callbacks benützt bzw. ob überhaupt ein callback notwendig ist für das eigene vorhaben, genauso wie mit threads. solche sachen sind mit äusserster vorsicht zu genießen.

@ts-soft
ts-soft hat geschrieben: >> - ist der timer genau genug, um die routine alle 20 oder sogar nur 10 ms aufzurufen?
Ohne besondere Maßnahmen ist unter NT-Systemen eine Genauigkeit von
10ms, unter Win9x von 56ms
hab es jetzt nicht ausprobiert, aber wirkt sich timeBeginPeriod/timeEndPeriod_() auch auf SetTimer aus? wenn ja dann wars das mit der ungenauigkeit.

c ya,
nco2k
~|__/
..o.o.. <--- This is Einkaufswagen. Copy Einkaufswagen into your signature to help him on his way to world domination.
Benutzeravatar
mk-soft
Beiträge: 3846
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Windows ist keine Echzeit Betriebssystem. SetTimer(...) oder Delay(...) kann nicht gewährleistet werden das es wirklich in der angegebene Zeit abläuft.

FF :wink:

P.S. Kleiner Test

Code: Alles auswählen

Debug "Test"

start = ElapsedMilliseconds()
For i = 1 To 3000
  Delay(0)
Next
ende = ElapsedMilliseconds()
zeit1 = ende - start

start = ElapsedMilliseconds()
For i = 1 To 3000
  Delay(10)
Next
ende = ElapsedMilliseconds()

zeit2 = ende - start

Debug "Sollzeit: 30000 ms (3000 * 10 ms)"
Debug "Istzeit:  " + Str(zeit2 - zeit1) + " ms"

start = ElapsedMilliseconds()
For i = 1 To 1500
  Delay(0)
Next
ende = ElapsedMilliseconds()
zeit1 = ende - start

start = ElapsedMilliseconds()
For i = 1 To 1500
  Delay(20)
Next
ende = ElapsedMilliseconds()

zeit2 = ende - start

Debug "Sollzeit: 30000 ms (1500 * 20 ms)"
Debug "Istzeit:  " + Str(zeit2 - zeit1) + " ms"

Zuletzt geändert von mk-soft am 07.09.2006 19:12, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
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 »

nco2k hat geschrieben: hab es jetzt nicht ausprobiert, aber wirkt sich timeBeginPeriod/timeEndPeriod_() auch auf SetTimer aus? wenn ja dann wars das mit der ungenauigkeit.

c ya,
nco2k
Das wirkt sich auf SetTimer für diesen Process aus. So hab ichs irgendwo mal
gelesen und verstanden. Ohne Gewähr :mrgreen:
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
Antworten