Seite 3 von 3

Re: [5.41] Fehlermeldung bei WaitWindowEvent()

Verfasst: 30.12.2015 12:58
von GPI
schleicher hat geschrieben:Schön wäre es, wenn mal hier schreibt, wie es denn richtig gemacht wird. Ich bekomme auch diese Meldung, wenn ich in einer Procedure

Code: Alles auswählen

While WindowEvent() :Wend
aufrufe. Aber mache ich das nicht, dann erfolgt keine Anzeige im Window. Hier mal ein Beispiel, wo das auftritt
Wie sieht den die Hauptschleife aus? Eventuell solltest du die Procdure mit CreateThread aufrufen, so das sie Parallel läuft. Da muss man aber auch etwas aufpassen, das man nicht die gleichen Variablen zeitgleich öffnet. Und man sollte verhindern, das man mehrmals gleichzeitig den Thread aufruft.

Das Problem mit "While WindowEvent():Wend" ist auch, wenn in diesen Zeitpunkt der Benutzer irgendwas macht - Button drückt bspw. - wird es komplett verschluckt.

Ich vermute mal deine Hauptschleife sieht so grob so aus:

Code: Alles auswählen

repeat
   event=WaitWindowEvent() 
...
  list_ftp_movie(dir$)
...
forever
hier wird die List_FTP_Movie abgearbeitet und in der zwischenzeit kommt nie ein WindowEvent(). Das musst du ändern.
p.s.: Ob du list_ftp_movie bei einen BindEvent() aufrufst, macht in den Beispiel keinen Unterschied, da springt man auch raus aus der Hauptroutine, die dann ruht.

Re: [5.41] Fehlermeldung bei WaitWindowEvent()

Verfasst: 30.12.2015 13:23
von schleicher
GPI hat geschrieben:

Code: Alles auswählen

repeat
   event=WaitWindowEvent() 
...
  list_ftp_movie(dir$)
...
forever
hier wird die List_FTP_Movie abgearbeitet und in der zwischenzeit kommt nie ein WindowEvent(). Das musst du ändern.
.
Ja genauso ist die Eventschleife.
Mit CreateThread habe ich noch nicht gearbeitet. Muss ich mich erst richtig belesen, wie ich das machen muss.
Im Prinzip habe ich dich jetzt so verstanden, das es funktionieren würde, wenn die Ergebnisse von list_ftp_movie(dir$) nicht in der Procedure, sondern in der Haupschleife abgearbeitet werden. Richtig ?
Wie geht das mit CreateThread ?

Re: [5.41] Fehlermeldung bei WaitWindowEvent()

Verfasst: 30.12.2015 13:32
von mk-soft
@All
Hilfe... Warten wir auf den Threadersteller wo das Problem wirklich ist. Vielleicht is es wirklich ein Bug.

@Schleicher
Diese Verarbeitung in einen Thread auslagern und mit PostEvent mit der GUI kommunizieren

oder mit SendEvent...
http://www.purebasic.fr/german/viewtopi ... =Sendevent
http://www.purebasic.fr/german/viewtopi ... =Sendevent

Es sollte immer nur ein (Wait)WindowEvent() geben. Es gibt nur sehr selten ausnahmen.
Zum Beispiel verwende ich mir einen eigenen WWE alle Events bei der Anzeige von Lizenz-Info.

P.S.
Beispiel mit PostEvent und EventData. Dabei wird für jedes Event für die Daten ein Speicher angefordert und nach Verarbeitung wieder freigegeben.
Somit wird ein Datenverlust auch bei blockierten GUI (Menu aktiv, Resize) vermieden.
Funktioniert somit auch sauber unter Linux und Mac

Code: Alles auswählen

;-TOP

; Basis

; Konstanten

Enumeration ;Window
  #Main
EndEnumeration

Enumeration ; Menu
  #Menu
EndEnumeration

Enumeration ; MenuItems
  #MenuExit
EndEnumeration
  
Enumeration ; Gadgets
  #List
  #Edit
EndEnumeration

Enumeration ; Statusbar
  #Status
EndEnumeration

; Global Variable
Global exit

; Functions
Procedure UpdateWindow()
  
  Protected x, y, dx, dy, menu, status
  
  menu = MenuHeight()
  If IsStatusBar(#Status)
    status = StatusBarHeight(#Status)
  Else
    status = 0
  EndIf
  x = 0
  y = 0
  dx = WindowWidth(#Main)
  dy = WindowHeight(#Main) - menu - status
  ResizeGadget(#List, x, y, dx, dy)
  
EndProcedure


;-

Enumeration #PB_Event_FirstCustomValue
  #My_Event_Data
EndEnumeration

Structure udtData
  value.i
  text.s
EndStructure

Procedure Send(id)
  
  Protected value, *mem.udtData
  
  Repeat
    Repeat
      *mem = AllocateStructure(udtData)
      If *mem = 0 ; Zur Zeit kein Speicher verfügbar
        Delay(1000)
      EndIf
    Until *mem
    *mem\value = value
    *mem\text = "Value " + value
    PostEvent(#My_Event_Data, 0, 0, 0, *mem)
    value + 1
    Delay(1000)
  Until exit
  
EndProcedure

Procedure Receive()
  
  Protected *mem.udtData
  
  *mem = EventData()
  Debug *mem\value
  AddGadgetItem(#List, -1, *mem\text)
  FreeStructure(*mem)
  
EndProcedure

; Main
Procedure Main()
  
  Protected event, style, dx, dy
  
  style = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget
  dx = 800
  dy = 600
  
  If OpenWindow(#Main, #PB_Ignore, #PB_Ignore, dx, dy, "Main", style)
    
    ; Enable Fullscreen
    CompilerIf #PB_Compiler_OS = #PB_OS_MacOS 
      Protected NewCollectionBehaviour
      NewCollectionBehaviour = CocoaMessage(0, WindowID(#Main), "collectionBehavior") | $80
      CocoaMessage(0, WindowID(#Main), "setCollectionBehavior:", NewCollectionBehaviour)
    CompilerEndIf
    
    ; Menu
    CreateMenu(#Menu, WindowID(#Main))
    MenuTitle("Ablage")
    MenuItem(#MenuExit, "Be&enden")
    ; Gadgets
    ListViewGadget(#List, 0, 0, dx, dy)
    
    ; Statusbar
    CreateStatusBar(#Status, WindowID(#Main))
    AddStatusBarField(#PB_Ignore)
    
    UpdateWindow()
    
    ; Init
    BindEvent(#My_Event_Data, @Receive())
    CreateThread(@Send(), 0)
    
    ; Main Loop
    Repeat
      event = WaitWindowEvent()
      Select event
        Case #PB_Event_Menu
          Select EventMenu()
            CompilerIf #PB_Compiler_OS = #PB_OS_MacOS   
              Case #PB_Menu_About
                
              Case #PB_Menu_Preferences
                
              Case #PB_Menu_Quit
                exit = #True
                
            CompilerEndIf
              
            Case #MenuExit
              exit = #True
              
          EndSelect
          
        Case #PB_Event_SizeWindow
          Select EventWindow()
            Case #Main
              UpdateWindow()
              
          EndSelect
          
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case #Main
              exit = #True
              
          EndSelect
          
      EndSelect
      
    Until exit
    
  EndIf
  
EndProcedure : Main()

End

Re: [5.41] Fehlermeldung bei WaitWindowEvent()

Verfasst: 30.12.2015 16:21
von schleicher
Danke für dein gutes Beispiel. Ist eine saubere Lösung. Werde das bei mir umsetzen.

Re: [5.41] Fehlermeldung bei WaitWindowEvent()

Verfasst: 01.01.2016 09:04
von ThoPie
Danke an alle die konstruktiv geholfen haben. Ich habe den Code bereinigt. War doch noch ein Fehler drin.
Also vielen Dank nochmal.