Seite 2 von 2

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Verfasst: 12.12.2009 00:53
von TomS
NicTheQuick hat geschrieben:Wichtig wäre vielleicht noch zu erwähnen, dass man dann auch nicht 'WaitWindowEvent()' nehmen sollte, sondern nur 'WindowEvent()'.
Da seht nirgends was von WaitWindowEvent() :freak:
Kaeru Gaman hat geschrieben:man sollte WaitWindowEvent(TimeOut) verwenden.
bitte nicht zwei Jahre alte Krücken empfehlen.
Jo. Hast recht.^^

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Verfasst: 12.12.2009 01:24
von NicTheQuick
Find ich persönlich ziemlich blöde ein Timeout einzubauen, wenn man gleichzeitig irgend etwas in der selben Schleife ausführen will.

Aber da ich immer noch nicht weiß wie rechenintensiv diese auszuführende Prozedur ist, kann man hier nur mutmaßen.

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Verfasst: 12.12.2009 01:46
von ts-soft
> Find ich persönlich ziemlich blöde ein Timeout einzubauen
Ist aber nicht so blöde wie einfach per WindowEvent() ein einzelnes Event() aus dem Pool zu nehmen, um
dann ungesteuert irgendwann ein weiteres zu behandeln :mrgreen:

Gruß
Thomas

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Verfasst: 12.12.2009 05:31
von Kaeru Gaman
NicTheQuick hat geschrieben:Find ich persönlich ziemlich blöde ein Timeout einzubauen, wenn man gleichzeitig irgend etwas in der selben Schleife ausführen will.
was willst du denn stattdessen machen, deine CPU braten?

man könnte nun sagen, es käme drauf an was man in dieser selben Schleife ausführen will,
aber wenn es so oft ausgeführt werden muss, dass ein TimeOut von 20ms es behindern würde,
dann ist es dort so fehl am Platz wie ein Hummer in einer Unterhose,
dann hat es nicht, nada, nothing in der Eventschleife zu suchen.

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Verfasst: 12.12.2009 19:05
von mk-soft
Ich habe mit Threads so weit keine Probleme. Gegebendenfals ThreadSafe Aktivieren.

Beispiel mit Thread.

Code: Alles auswählen



;- Konstanten
Enumeration ; Window ID
  #Window
EndEnumeration

Enumeration ; Menu ID
  #Menu
EndEnumeration

Enumeration ; MenuItem ID
  #Menu_Exit
  #Menu_thStart
  #Menu_thStop
  #Menu_thContinue
  #Menu_thExit
EndEnumeration

Enumeration ; Statusbar ID
  #Statusbar
EndEnumeration

Enumeration ; Gadget ID
  #List
EndEnumeration

; ***************************************************************************************

Procedure UpdateWindow()

  Protected x,y,dx,dy
  Protected mn,st,tb
  
  x = 0
  y = 0
  mn = MenuHeight()
  st = StatusBarHeight(#StatusBar)
  ;tb = ToolBarHeight(#ToolBar)
  dx = WindowWidth(#Window)
  dy = WindowHeight(#Window) - mn - st - tb
  ResizeGadget(#List, x, y, dx, dy)
  
EndProcedure

Procedure WriteLog(Info.s)
  Protected temp.s
  temp = FormatDate("%YYYY.%MM.%DD %HH:%II:%SS - ", Date()) + Info
  AddGadgetItem(#List, -1, temp)
  If CountGadgetItems(#List) > 500
    RemoveGadgetItem(#List, 0)
  EndIf
EndProcedure

;- Globale Variablen
Global exit = 0

;- Declare Functions
Declare thTest(*thCommand.integer)

;- Fenster
style = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget
If OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 400, 300, "Fenster", style)
  ; Menu
  If CreateMenu(#Menu, WindowID(#Window))
    MenuTitle("&Datei")
      MenuItem(#Menu_thStart,"Start")
      MenuItem(#Menu_thStop,"Stop")
      MenuItem(#Menu_thContinue,"Weiter")
      MenuItem(#Menu_thExit,"Ende")
      MenuBar()
      MenuItem(#Menu_Exit, "Be&enden")
  EndIf
  ; Statusbar
  CreateStatusBar(#Statusbar, WindowID(#Window))
  ; Gadgets
  If CreateGadgetList(WindowID(#Window))
    ListViewGadget(#List, 0,0,0,0)
  EndIf
  
  ;-- Hauptschleife
  Repeat
    event   = WaitWindowEvent()
    window  = EventWindow()
    menu    = EventMenu()
    type    = EventType()
    Select event
      Case #PB_Event_Menu
        Select menu
          Case #Menu_Exit
            If Not MyThread
              Exit = 1
            EndIf
          Case #Menu_thStart
            If MyThread = 0
              MyThread = CreateThread(@thTest(), @Command)
              Command = 1
            EndIf
          
          Case #Menu_thStop
            Command = 2
          
          Case #Menu_thContinue
            Command = 3
          
          Case #Menu_thExit
            Command = 4
            MyThread = 0
          
        EndSelect
      Case #PB_Event_Gadget
      Case #PB_Event_CloseWindow
        If Not Mythread
          Exit = 1
        EndIf
        
      Case #PB_Event_Repaint
      Case #PB_Event_SizeWindow
        UpdateWindow()
        
      Case #PB_Event_MoveWindow
      Case #PB_Event_ActivateWindow
      Case #PB_Event_SysTray
    
    EndSelect
    
  Until Exit
EndIf
 
;- Functions


Procedure thTest(*thCommand.integer)
  
  Protected thExit = 0
  Protected do
  Static thRef = 0
  
  thRef + 1
  
  While Not thExit
    
    Select *thCommand\i
      Case 1 ; Start
        If do = 0
          ; code befor Do
          WriteLog("Start ID " + Str(thRef))
        EndIf
        do = 1
  
      Case 2 ; Stop
        If do = 1
          ; code befor Stop
          WriteLog("Stop ID " + Str(thRef))
          do = 2
        EndIf
        
      Case 3 ; Continue
        If do = 2
          ; Code befor Restart
          WriteLog("Continue ID " + Str(thRef))
          do = 1
        EndIf
      Case 4 ; Exit
        ;If do = 2
          ; Code befor Exit
          WriteLog("Exit ID " + Str(thRef))
          do = 4
          thExit = #True
        ;EndIf
        
    EndSelect
    ; Delete Command
    *thCommand\i = 0
    
    Select do
      Case 0 ; Nothing
        Delay(10)
        
      Case 1 ; Work
        WriteLog("Work ID " + Str(thRef))
        Delay(1000)
            
      Case 2 ; Stop
        Delay(10)
        
    EndSelect
    
  Wend
  
  thRef - 1
          
EndProcedure
FF :wink:

Re: Schleife bleibt stehen und muss auf Prozedurende warten

Verfasst: 13.12.2009 14:13
von Chef Wiggum
Vielen Dank für die Antworten :-)

Ja, ich habe es jetzt auch via Threads gelöst und habe soweit auch keine Probleme. War nur ein bisschen abgeschreckt weil ich hier und da Negatives gelesen hatte(kritische Programmstabilität usw. ).

Schönen dritten Advent und Grüße ;-)