Seite 2 von 2

Verfasst: 31.10.2006 14:02
von a14xerus
dann mach :

Code: Alles auswählen

while isthread(thread)
delay(100)
wend
debug "fertig"

Verfasst: 31.10.2006 14:11
von Kaeru Gaman
@axerus
funktioniert zwar, aber ist doch am thema vorbei.
mindestens ein windowevent sollte drin sein.

Verfasst: 31.10.2006 14:34
von ts-soft
Das Beispiel von mk-soft mal erweitert, mehr Themenbezogen.

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #ButtonGadget_0
EndEnumeration

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, #PB_Ignore, 0, 157, 85, "#Window_0")
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(#ButtonGadget_0, 35, 25, 95, 30, "Start")
    EndIf
  EndIf
EndProcedure

OpenWindow_Window_0()

Global ThreadActiv.l

Procedure MyThread(ID)
  For i = 0 To 10 ;
    Delay(1000)
  Next i
  DisableGadget(#ButtonGadget_0, #False)
  ThreadActiv = #False
EndProcedure

Repeat
  Event = WaitWindowEvent(100)
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()

      If EventGadget = #ButtonGadget_0
        If ThreadActiv = #False
          SetWindowState(#Window_0, #PB_Window_Minimize)
          DisableGadget(#ButtonGadget_0, #True)
          hThread = CreateThread(@MyThread(), 0)
          If hThread
            ThreadActiv = #True
          EndIf
        EndIf
      EndIf
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        If ThreadActiv = #True
          KillThread(hThread)
        EndIf
        Break
      EndIf
    Default
      If ThreadActiv = #False
        SetWindowState(#Window_0, #PB_Window_Normal)
      EndIf
  EndSelect
ForEver
Keine Garantie, das dies Sicher ist :wink:

Verfasst: 31.10.2006 15:03
von HeX0R
Ich habe mir angewöhnt per PostMessage() mit der Hauptschleife zu kommunizieren.
So kann man im Prinzip alle Gadget-Relevanten Abläufe da verarbeiten, wo sie hingehören (also nicht in den Thread).

Nachteil ist natürlich, dass es nen Api-Aufruf ist.
(Wie wäre denn das Linux-Pendant ?)

Beispiel:

Code: Alles auswählen

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #ButtonGadget_0
EndEnumeration

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, #PB_Ignore, 0, 157, 85, "#Window_0")
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(#ButtonGadget_0, 35, 25, 95, 30, "Start")
    EndIf
  EndIf
EndProcedure

OpenWindow_Window_0()

Procedure MyThread(ID)
  For i = 0 To 10 ;
    Delay(1000)
  Next i
  PostMessage_(WindowID(#Window_0), #WM_USER, #Null, #Null)
EndProcedure

Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()

      If EventGadget = #ButtonGadget_0
        If IsThread(hThread) = #False
          SetWindowState(#Window_0, #PB_Window_Minimize)
          DisableGadget(#ButtonGadget_0, #True)
          hThread = CreateThread(@MyThread(), 0)
        EndIf
      EndIf
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        If IsThread(hThread)
          KillThread(hThread)
        EndIf
        Break
      EndIf
    Case #WM_USER
    	DisableGadget(#ButtonGadget_0, #False)
      SetWindowState(#Window_0, #PB_Window_Normal)
  EndSelect
ForEver

Verfasst: 31.10.2006 15:23
von ts-soft
Gute Sache mit PostMessage :allright:

Event = WaitWindowEvent() ohne 100 reicht dann aber :mrgreen:

Gruß
Thomas

Verfasst: 31.10.2006 15:50
von HeX0R
uuups, da hast du natürlich völlig recht!
Gleich mal korrigieren.

Verfasst: 31.10.2006 16:37
von a14xerus
Kaeru Gaman hat geschrieben:@axerus
funktioniert zwar, aber ist doch am thema vorbei.
mindestens ein windowevent sollte drin sein.
War nur auf das viorherige Post bezogen, weil die repeat ein wenig umständlich war