waitwindowevent() unerklärlicher event

MAC OSX spezifisches Forum
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
kartmanne
Beiträge: 108
Registriert: 19.03.2015 18:16
Wohnort: Altenstadt
Kontaktdaten:

waitwindowevent() unerklärlicher event

Beitrag von kartmanne »

HI,

folgender code liefert auf PB-win7-64bit immer den event #pb_event_timer (dezimal15). Jedoch nicht auf PB-Mac-64bit

Code: Alles auswählen

hd_timer=2000
Debug    #PB_Event_Timer
Repeat 
  
  AddWindowTimer(Window_hd,1,hd_timer) 
  event = WaitWindowEvent(); timeout = Abfragezeitspanne für Vitaldaten
  RemoveWindowTimer(Window_hd,1)
  Debug event
  
  eventmenu=EventMenu()
  eventtype=EventType()
  eventwindow=EventWindow()
  
  Debug eventwindow
  Debug window_hd
  If event=#PB_Event_Timer
    eventtimer=EventTimer()
    Debug "hd_timer_timerevent" 
  EndIf
  
  StartVectorDrawing(CanvasVectorOutput(Canvas_0_hd))
  StopVectorDrawing()
Forever
Lasse ich die beiden Vector-Befehle weg, kommt der timer event.
Beim ersten Durchlauf der schleife kommt der timer-event. Danach kommt (nach time_out timer_hd) immer der event dezimal 4 (welcher ist das?)
(vorausgesetzt natürlich dass ich nix mache. Bewege ich die Maus oder so, kommen ohne time_out sofort andere events, die ich aber nicht geprüft habe)
Das Canvas_0_hd existiert im window_hd.

Warum ist das auf Mac anders als auf Win7?

Und welcher event ist der dezimal 4?

Probiert mit PB5.62 und PB5.70. Beide zeigen gleiches Verhalten. XCODE ist aktualisiert(10.1). MacOS10.13.6

Edit by NicTheQuick: Code-Tags gesetzt
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: waitwindowevent() unerklärlicher event

Beitrag von NicTheQuick »

Du nutzt den WindowTimer falsch oder ich verstehe nicht, was du damit vor hast.

Den Timer erstellt man in der Regel nur einmal und wartet dann auf die wiederkehrenden Events bis man ihn wirklich nicht mehr braucht und dann eben wieder löscht. Schau dir dazu das Beispiel in der Hilfe an. Aus irgendeinem Grund erstellst du den Timer, wartest auf ein beliebiges Event und löschst ihn direkt wieder. Da in einer Fensteranwendung in der Regel eine Menge Events auftreten, wird dein Timer vermutlich erstellt und direkt wieder gelöscht bevor der Timerevent überhaupt auftreten konnte.

Ansonsten freuen sich die meisten Helfer hier, wenn sie einen lauffähigen Code bekommen, den sie nur kopieren und einfügen müssen. In deinem Fall fehlt noch einiges drum herum um direkt mit dem Testen deines Beispiels loslegen zu können.
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: waitwindowevent() unerklärlicher event

Beitrag von Josh »

Mach dir keine Gedanken, welche Events geschossen werden. Windows selbst löst auch Events auch, die nirgends dokumentiert sind.
Benutzeravatar
kartmanne
Beiträge: 108
Registriert: 19.03.2015 18:16
Wohnort: Altenstadt
Kontaktdaten:

Re: waitwindowevent() unerklärlicher event

Beitrag von kartmanne »

HI,

ob richtig benutzt oder nicht, hängt sicher auch davon ab, was ich erreichen möchte. Ich möchte eine Hauptschleife, die sofort auf div. Eingabe"-events (Mausklick, Tastatur, Fenstercshließen, etc.) und(!) nin gewissen Zeitabständen eigenständig reagiert. Ich benutzt mehr, als einen timer. Je nach Event werden unterschiedlich lange Aufgaben erledigt. Setzte ich einen einmaligen timer, müßte der länger sein, als die max. Ausführungszeit der längsten Aufgabe. Das ist aber auf jedem PC nun mal anders lang. Setz ich die zu lang, freuen sich die PC-Nutzer mit highend-Rechnern, weil die applikation vor sich hinschnarcht oder die mit den 500MHz-XP-Werkstattrechnern, die die Applikation gar nicht erst zum Laufen kriegen.
Setz ich ein timeout in waitwindowevent(time_out), weiß ich nach dem event nicht, welcher timer das war. Insofern - glaube ich, dass meine Lösung nicht so schlecht ist, da sie immer einen gewissen zeitbereich nicht aktiv ist, also dem System auch CPU-Zeit läßt. Spielt auch keine Rolle, denn bisher hat das bisher auf WIN und MACOX so funktioniert. Ich weiß nicht seit wann genau, aber aktuell mit PB5.62 und MacOS10.13.6 und XCODE10.1 läuft's eben nicht.
WIN bringt den event "4" gar nicht, MacOSX schon.

Ja, klar ist das hier einfügen eines lauffähigen codes sinnvoll. Da mein Programm nun schon sehr lang ist, nehme ich immer die Passagen raus, die ich klar als nicht erforderlich schon "rausprobiert" hab.

Aber gern: hier der code, der vollständig das unterschiedliche Verhalten zeigt:
Window_hd = OpenWindow(#PB_Any, 100, 100, 200, 200, "", #PB_Window_SystemMenu)
Canvas_0_hd = CanvasGadget(#PB_Any, 10, 10, 90, 90)
hd_timer=2000
Debug #PB_Event_Timer
Repeat

AddWindowTimer(Window_hd,1,hd_timer)
event = WaitWindowEvent(); timeout = Abfragezeitspanne für Vitaldaten
RemoveWindowTimer(Window_hd,1)
Debug event

eventmenu=EventMenu()
eventtype=EventType()
eventwindow=EventWindow()

Debug eventwindow
Debug window_hd
If event=#PB_Event_Timer
eventtimer=EventTimer()
Debug "hd_timer_timerevent: "+Str(eventtimer)
EndIf

StartVectorDrawing(CanvasVectorOutput(Canvas_0_hd))
StopVectorDrawing()

Until event=#PB_Event_CloseWindow
End
Benutzeravatar
kartmanne
Beiträge: 108
Registriert: 19.03.2015 18:16
Wohnort: Altenstadt
Kontaktdaten:

Re: waitwindowevent() unerklärlicher event

Beitrag von kartmanne »

HI,
Da in einer Fensteranwendung in der Regel eine Menge Events auftreten, wird dein Timer vermutlich erstellt und direkt wieder gelöscht bevor der Timerevent überhaupt auftreten konnte.
Das könnte stimmen, denn wenn ich den timer einmalig vor der schleife setze und nie remove, kommt der timer_event immer.

Zudem sieht man im debugfenster, dass
  • hd_timer_timerevent: 1
    275
    3679456
    3679456
    13110
    3679456
    3679456
    hd_timer_timerevent: 1
    275
    3679456
    3679456
    13110
    3679456
    3679456
    hd_timer_timerevent: 1
13110 wohl der timer_event ist und 275 irgedwas anderes. Auf Macosx sind äquivalent 15 der timer und 4 irgendwas anderes. Der 15 kommt nur, wenn die canvas-zeilen auskommentiert sind. Insofern... werde ch mir als gedanken machen, wie ich das mit den zwei timern macos-kompatibel lösen kann...
Danke für die Hilfe und den Anschub für's Denken :-)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: waitwindowevent() unerklärlicher event

Beitrag von NicTheQuick »

Ich glaube hier geht es um ein grundsätzliches Problem. Es ist eigentlich keine gute Lösung mittels Polling zu überprüfen, ob Aufgaben abgeschlossen wurden. Erklär doch mal etwas genauer was du da für Aufgaben hast und wie du die überhaupt im Hintergrund abarbeitest. Nutzt du Threads oder rufst du externe Programme dafür auf? Mit etwas mehr Hintergrund können wir dir vielleicht noch besser helfen und dir einen eleganteren Lösungsansatz anbieten.

Ansonsten ist die Sache mit dem erstellen und direkt Löschen des Timers weiterhin Murks. Denn jede Mausbewegung auf dem Fenster, jedes Refresh-Events, Minimieren, Maximieren, und vieles mehr erzeugt Events, wodurch WaitWindowEvent() einen Wert zurück gibt und daraufhin dein Timer gelöscht wird. Das ergibt keinen Sinn.
Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: waitwindowevent() unerklärlicher event

Beitrag von mk-soft »

Ich weiss auch nicht was das für langfristige aufgaben sind...

Aber die Event-Schleife sollte nur kurzfristige Aufgaben erledigen weil sonst die GUI hängt.
Langfristige Aufgaben man bestens in Threads auslagern, wie grosse Dateien laden und auswerten oder Datenbankbearbeitungen.

Wichtig ist aber das GUI-Element bei MacOS und Linux nur im Hauptprogramm (WaitWindowEvent() geändert werden dürfen.
Dazu verwende ich das Modul ThreadToGUI um Gadgets aus Threads zu ändern. Listen hinzufügen, etc.
Siehe viewtopic.php?f=8&t=29728

Beispiel: viewtopic.php?f=21&t=30246&p=341476#p341476
Zuletzt geändert von mk-soft am 03.05.2019 15:55, 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
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: waitwindowevent() unerklärlicher event

Beitrag von mk-soft »

Schau mal nach den PB_Event_XXX

4 ist PB_Event_Repaint
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: waitwindowevent() unerklärlicher event

Beitrag von GPI »

Eventuell ein kleines Verständnisproblem. Aber man nutzt halt auch Konstanten, weil die sich von Betriebsystem zu Betriebsystem ändern können.
Und auch wichtig, zum Teil kommen hier auch ungefiltert die Systemnachrichten durch, sprich es gibt durchaus events, für die es keine Konstanten gibt.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
kartmanne
Beiträge: 108
Registriert: 19.03.2015 18:16
Wohnort: Altenstadt
Kontaktdaten:

Re: waitwindowevent() unerklärlicher event

Beitrag von kartmanne »

HI,

diese zeitintensiven Aufgaben sind grafische Ausgaben.

Mit threads hab ich noch nicht gearbeitet. Da muß ich noch lernen, was deren Sinn ist, was die so alles könn(t)en und wie man das richtig verwendet.

Danke für die Hilfe. hab jetzt den Teiler permanent in der Hauptschleife. Das geht. Ob's aber ein "guts System" so ist, naja...
Antworten