Seite 1 von 1

seltsamer effekt bei timer-benutzung

Verfasst: 04.06.2008 15:49
von upgrader
innerhalb einer größeren Schleife möchte ich eine Abbruchmöglichkeit haben. Dazu habe ich folgendes codiert:

Code: Alles auswählen

Define.l  timewin

   OpenWindow(1, 0, 0, 100, 20, "T=", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_TitleBar)
   timewin = WindowID(1)
   ShowWindow_(timewin, #SW_SHOWMINIMIZED)
   


   Repeat
      Beep_(1000,200)   ; Abbruch möglich
      ShowWindow_(timewin, #SW_RESTORE)
      SetWindowPos_(timewin, #HWND_TOPMOST | #HWND_TOP, DesktopMouseX()-30, DesktopMouseY()-50, 100, 100,#SWP_SHOWWINDOW)
   
      While WindowEvent() <> 0: Delay(1): Wend                  ; queue leeren
      SetTimer_(timewin, 1, 3000, 0)  

Debug "start timer"

      Delay(200)
      ; Zeit lassen um eventuell abzubrechen durch RightClick
      Repeat
          Event      = WaitWindowEvent()
          eventwin.l = EventWindow()
          eventtype.l  = EventType() 

Debug "lauf timer    Event="+Str(Event)+"    "+ "     " + Str(eventwin) + "   " + Str(eventtype) + "   " + Str(#PB_EventType_RightClick)

          If Event = #WM_RBUTTONDBLCLK  :  CallDebugger: : EndIf  ;#WM_RBUTTONDBLCLK = 518 
          Delay(1)
      Until Event = #WM_TIMER 

      KillTimer_(timewin, 1)  

Debug "stop timer"

      While WindowEvent() <> 0: Delay(1): Wend                  ; queue leeren
    ;  ShowWindow_(timewin, #SW_SHOWMINIMIZED)   ;[color=red]<<< HIER GUCKEN![/color]
   
    ForEver
Am debug output kann man schön sehen wie es läuft: 3 Sekunden verzögerung in denen man abbrechen kann.
ABER: macht man den Kommentar vor dem letzten "ShowWindow" weg, dann rauscht er einfach durch. Keine Ahnung warum.

Verfasst: 04.06.2008 16:14
von ts-soft
Bevor jemand das testet, sollte er alle offenen Dokumente speichern!
Ansonsten kanns zu Datenverlust führen!
Ich glaube ja nicht das der Autor dieses Threades haftet :mrgreen:

Verfasst: 04.06.2008 16:23
von rolaf
ts-soft hat geschrieben:Bevor jemand das testet, sollte er alle offenen Dokumente speichern!
Ansonsten kanns zu Datenverlust führen!
Ich glaube ja nicht das der Autor dieses Threades haftet :mrgreen:
Was :o werden jetzt hier schon Schadcodes veröffentlicht? :freak:

Verfasst: 04.06.2008 16:25
von Kaeru Gaman
ich schätze eher, das das ding sich komplett aufhängt...

Verfasst: 04.06.2008 16:27
von upgrader
Kann mich mal jemand genauer aufklären??

Verfasst: 04.06.2008 16:28
von ts-soft
Falo hat geschrieben: Was :o werden jetzt hier schon Schadcodes veröffentlicht? :freak:
Ich schätze mal, da hat sich einer extra neu angemeldet, um diesen Scherz
zu posten.
Das kleine, der Maus folgende Fenster macht es fast unmöglich einen Button
zu drücken, so das man zwar den Taskmanager aufrufen, aber dort nur sehr
schwer etwas beenden kann.

Verfasst: 04.06.2008 16:31
von upgrader
Nee das ist kein scherz. Das window soll ja verschwinden, aber wenn der dazu gehörige "showwindow" ausgeführt wird, dann läuft der timer nicht.
ausserdem kann man ja mit doppel-right-click die schleife beenden.

Verfasst: 04.06.2008 16:58
von upgrader
:praise: Entschuldigt wenn der code probleme machte. Das mit dem doppel-right-click steht nur im code. Sorry.
Darf ich die Frage mal so formulieren: Warum läuft der 3-sekunden timer sofort ab, wenn hinter der waitwindowevent() schleife das timer-window
minimiert wird?
Vielleicht erbarmt sich jemand, der die Antwort weiß?

Verfasst: 04.06.2008 18:06
von ts-soft
Der Code sieht scheußlich aus, muß gesagt werden.
SetTimer_ gehört nichts in die Event-Schleife, sondern davor. TimerCallback
nutzen, nicht in der Event-Schleife, da PB ja selber einen Timer dort
verwaltet (siehe opt. Parameter für WaitWindowEvent(timeout)

SetWindowState statt API.

Ob das den Fehler beseitigt kann ich aber nicht sagen :mrgreen:

Verfasst: 04.06.2008 18:24
von upgrader
Danke. Meine Entschuldigung angenommen.
Der code wird etwas durch das forum-format verzerrt.
Mit PB Funktionen geht es leider auch nicht. Ich bin ja schon deshalb auf APIs gekommen, weil PB kein forgeschrittenes window-handling zulässt, z.B. Zugriff auf windows anderer threads.
Ich versuch mal die messages direkt zu behandeln. Mal sehen.