Problem: Programm pausiert beim Verschieben des Fensters
Problem: Programm pausiert beim Verschieben des Fensters
Hi Leute,
habe mal wieder eine Frage an euch. Ich arbeite gerade an einem Software-Oszilloskop (hier ein paar Bilder: http://forum.arduino.cc/index.php?topic=160703.60).
Die Daten die ich auswerte, erhalte ich über die COM-Schnittstelle. An sich funktioniert alles gut. ...doch sobald ich mit der Maus die Titelleiste anklicke und den Maus-Button gedrückt halte, pausiert das Programm. Es führt nach wenigen Millisekunden zum Pufferüberlauf und die Daten sind somit inkonsistent.
Nach langem hin und her habe ich es nun über einen zweiten Thread gelöst, das soweit auch funktioniert. Das Problem ist aber immer wieder die Übergabe oder das Verwenden von Resourcen/Variablen, wenn mehrere Threads auf eine Resource zeitgleich zugreifen wollen. Ich kann das Problem zwar lösen, aber es ist irgendwie nicht das gelbe vom Ei. Schöner wäre es, wenn ich auf diese Threads verzichten könnte. Das würde viele Probleme im Keim ersticken.
Ist es möglich, dass das Programm immer läuft und niemals pausiert? Gibt es da irgendwo eine Einstellung oder ähnliches?
lg
SBond
habe mal wieder eine Frage an euch. Ich arbeite gerade an einem Software-Oszilloskop (hier ein paar Bilder: http://forum.arduino.cc/index.php?topic=160703.60).
Die Daten die ich auswerte, erhalte ich über die COM-Schnittstelle. An sich funktioniert alles gut. ...doch sobald ich mit der Maus die Titelleiste anklicke und den Maus-Button gedrückt halte, pausiert das Programm. Es führt nach wenigen Millisekunden zum Pufferüberlauf und die Daten sind somit inkonsistent.
Nach langem hin und her habe ich es nun über einen zweiten Thread gelöst, das soweit auch funktioniert. Das Problem ist aber immer wieder die Übergabe oder das Verwenden von Resourcen/Variablen, wenn mehrere Threads auf eine Resource zeitgleich zugreifen wollen. Ich kann das Problem zwar lösen, aber es ist irgendwie nicht das gelbe vom Ei. Schöner wäre es, wenn ich auf diese Threads verzichten könnte. Das würde viele Probleme im Keim ersticken.
Ist es möglich, dass das Programm immer läuft und niemals pausiert? Gibt es da irgendwo eine Einstellung oder ähnliches?
lg
SBond
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

- NicTheQuick
- Ein Admin
- Beiträge: 8838
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: Problem: Programm pausiert beim Verschieben des Fensters
Wenn deine Ereignisschleife stehen bleibt, sobald du das Fenster verschiebst, kannst du das ändern, indem du den Timeout-Parameter von 'WaitWindowEvent()' verwendest oder einen Window-Timer mit 'AddWindowTimer()' benutzt. Beispiele dazu findest du in der Hilfe.
An deiner Stelle würde ich aber trotzdem die Thread-Variante bevorzugen. Allerdings musst du dann auch wissen wie du die Daten zwischen Thread und Hauptprogramm sauber austauschst. Dazu gibt es Mutex und Semaphoren. Bei den Semaphoren gibt es in der Hilfe ein schönes Beispiel zum Austausch von Daten zwischen Thread und Hauptprogramm.
An deiner Stelle würde ich aber trotzdem die Thread-Variante bevorzugen. Allerdings musst du dann auch wissen wie du die Daten zwischen Thread und Hauptprogramm sauber austauschst. Dazu gibt es Mutex und Semaphoren. Bei den Semaphoren gibt es in der Hilfe ein schönes Beispiel zum Austausch von Daten zwischen Thread und Hauptprogramm.
Re: Problem: Programm pausiert beim Verschieben des Fensters
das mit den Parametern scheint aber nicht so recht zu klappen 
Ich nutze WaitWindowEvent() mit 2ms TimeOut, aber das Pausieren lässt sich trotzdem nicht verhindern.
Hast du eventuell ein Code-Beispiel? Eventuell bin ich ja auch einfach nur zu blöd um es richtig anzuwenden.
Wahrscheinlich ist es wirklich besser mit Threads zu arbeiten.
lg
SBond
Ich nutze WaitWindowEvent() mit 2ms TimeOut, aber das Pausieren lässt sich trotzdem nicht verhindern.
Hast du eventuell ein Code-Beispiel? Eventuell bin ich ja auch einfach nur zu blöd um es richtig anzuwenden.
Wahrscheinlich ist es wirklich besser mit Threads zu arbeiten.
lg
SBond
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

- HeX0R
- Beiträge: 3070
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3 - Kontaktdaten:
Re: Problem: Programm pausiert beim Verschieben des Fensters
Das lässt sich in der Tat nur durch Threads verhindern.SBond hat geschrieben:das mit den Parametern scheint aber nicht so recht zu klappen
Ich nutze WaitWindowEvent() mit 2ms TimeOut, aber das Pausieren lässt sich trotzdem nicht verhindern.
Ich habe dieses Verhalten schon vor ewigen Zeiten offiziell bemängelt, es interessiert aber keinen.
Schlimm ist ja nicht nur, dass die Ereignisschleife einfriert, viel schlimmer ist, dass dabei Events verloren gehen.
Wenn man nun z.B. von Threads über Window-Events mit seiner Hauptschleife kommunizieren will, kann es passieren, dass ein Dir wichtiges Signal nicht ankommt, weil der Anwender die Frechheit besessen hat, das Fenster währenddessen herumzuschieben...
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
- 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: Problem: Programm pausiert beim Verschieben des Fensters
Zumindest mit BindEvent() genutzte Events kommen auch beim verschieben an. So kann man sich dann doch
noch etwas behelfen.
noch etwas behelfen.
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Problem: Programm pausiert beim Verschieben des Fensters
Was du auf Windows benötigen würdest wäre #WM_MOVE.
Code: Alles auswählen
Procedure WinProc(hWnd, Msg, wParam, lParam)
Protected Old = GetProp_(hWnd, "PROC")
Static Count
Select Msg
Case #WM_MOVE
Count + 1
Debug "Move"+Str(Count)
EndSelect
ProcedureReturn CallWindowProc_(Old, hWnd, Msg, wParam, lParam)
EndProcedure
OpenWindow(0, 0, 0, 400, 300, "Move", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
SetProp_(WindowID(0), "PROC", SetWindowLongPtr_(WindowID(0), #GWL_WNDPROC, @WinProc()))
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver- HeX0R
- Beiträge: 3070
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3 - Kontaktdaten:
Re: Problem: Programm pausiert beim Verschieben des Fensters
Ach, ist das tatsächlich so?ts-soft hat geschrieben:Zumindest mit BindEvent() genutzte Events kommen auch beim verschieben an. So kann man sich dann doch
noch etwas behelfen.
Ich habe das nie ausprobiert, weil ich dachte "geht bestimmt eh nicht".
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
- 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: Problem: Programm pausiert beim Verschieben des Fensters
HeX0R hat geschrieben:Ach, ist das tatsächlich so?
Ich habe das nie ausprobiert, weil ich dachte "geht bestimmt eh nicht".
Code: Alles auswählen
EnableExplicit
Procedure SetTime()
SetWindowTitle(0, FormatDate("%hh:%ii:%ss", Date()))
EndProcedure
OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "")
AddWindowTimer(0, 1, 500)
BindEvent(#PB_Event_Timer, @SetTime())
While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend 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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Problem: Programm pausiert beim Verschieben des Fensters
ist natürlich interessant. So wie ich das sehe, ist die Funktion aber erst in der PB 5.20 enthalten. Ich warte aber erst noch etwas, bis die Version aus der Beta-Phase ist.
Ich denke mal, dass ich wohl bei den Threads bleiben muss. Ich habe da aber immernoch Probleme ein Array aus einem Thread in die Main-Schleife zu übertragen, ohne dass es zu Zugriffskonflikten kommt. Ich denke mal das Zauberwort wird Mutex sein.
Ich denke mal, dass ich wohl bei den Threads bleiben muss. Ich habe da aber immernoch Probleme ein Array aus einem Thread in die Main-Schleife zu übertragen, ohne dass es zu Zugriffskonflikten kommt. Ich denke mal das Zauberwort wird Mutex sein.
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

Re: Problem: Programm pausiert beim Verschieben des Fensters
Da das neue BindEvent() und seine Brüder eigentlich aus dem Callback des Windows direkt abgreifen, kannst du dir mit
einem eigenen WindowCallback behelfen.
Das Timer Beispiel von TS-Soft als Callback :
Wenn man einige merkwürdige Logiken von MS geschnallt hat, ist WindowAPI gar nicht mehr so
rätselhaft ...
einem eigenen WindowCallback behelfen.
Das Timer Beispiel von TS-Soft als Callback :
Code: Alles auswählen
EnableExplicit
#MeinTimer = 123 ; sollten ab 121 beginnen, um Konflikte zu vermeiden
Procedure WindowCallBack(hWnd, uMsg, wParam, lParam)
Protected Result = #PB_ProcessPureBasicEvents
Select uMsg
Case #WM_TIMER ; <-- Das Fenster erhält ein Timer Event
; --- Hier wird der Timer abgefragt
; --- in wParam steht die TimerEvent Nummer
If wParam = #MeinTimer
SetWindowTitle(0, FormatDate("%hh:%ii:%ss", Date()))
EndIf
; --- Sollte man den Timer nicht mehr brauchen
; KillTimer_(hWnd, #MeinTimer)
EndSelect
ProcedureReturn Result
EndProcedure
OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "")
; --- Ersatz für
; AddWindowTimer(0, #MeinTimer, 500)
SetTimer_(WindowID(0), #MeinTimer, 500, #Null)
; --- Ersatz für
; BindEvent(#PB_Event_Timer, @SetTime())
SetWindowCallback(@WindowCallBack(), 0)
; --- Und die Auswertung erfolgt im Callback
While WaitWindowEvent() <> #PB_Event_CloseWindow : Wend rätselhaft ...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom