Seite 2 von 3

Verfasst: 17.09.2007 07:04
von a14xerus
Kaeru Gaman hat geschrieben:....gäbs nicht die möglichkeit, die Close-Message in die Queue zu packen,
dass sie vom WindowEvent() der Hauptschleife verarbeitet wird?

ist das der ansatz mit SendMessage/PostMessage?
Genau das ist es :wink:

Verfasst: 17.09.2007 17:31
von SimonSimCity
Die gewünschte Lösung:
-> hab mich mit RS über ICQ unterhalten....

Code: Alles auswählen

Global FensterThread.s

Procedure Thread()  
  Debug "Test 1" 
  Delay(500) 
  Debug "Test 2" 
  Delay(500) 
  Debug "Test 3" 
  FensterThread = "FINT"
  ProcedureReturn
EndProcedure 

Procedure Window1() 
  If OpenWindow(1,0,0,100,100,"Window 1",#PB_Window_WindowCentered) 
    If CreateGadgetList(WindowID(1)) 
      TextGadget(2,10,10,100,20,"Test 2",0) 
    EndIf 
    Global Thread = CreateThread(@Thread(),0) 
    If IsThread(Thread)
    Else
      Fenster3Thread=1
    EndIf
  EndIf
  ProcedureReturn Fenster
EndProcedure 

If OpenWindow(0,0,0,200,200,"Window 0",#PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
  If CreateGadgetList(WindowID(0)) 
    TextGadget(1,10,10,100,20,"Test 1",0) 
  EndIf 
  Window1() 
  Repeat 
    If Thread=1 And IsWindow(1) And FensterThread="FINT"
      CloseWindow(1) 
    EndIf
   Until WaitWindowEvent(10) = #PB_Event_CloseWindow 
EndIf

Verfasst: 17.09.2007 18:19
von Kaeru Gaman
..und wo unterscheidet sich das groß von Nics Lösung?
nur dass das flag global gewählt wurde, und nicht byREF übergeben wird.

noch ein änderungsvorschlag

Code: Alles auswählen

#FT_FINT = 4711
#FT_RUN = 0

Global FensterThread.l

Procedure Thread() 
;...
  FensterThread = #FT_FINT
;...
EndProcedure 

;...
    If Thread=1 And IsWindow(1) And FensterThread = #FT_FINT 
;...
Konstanten für sprechende Werte sind besser als Strings.

Verfasst: 17.09.2007 18:37
von RSBasic
@Kaeru Gaman
>..und wo unterscheidet sich das groß von Nics Lösung?
Procedure Thread(*close.Long)
...
CreateThread(@Thread(), @close)
Da man nur maximal eine Variable an den Thread übergeben kann und da ich schon eine Variable für die Übergabe reserviert habe, geht das natürlich nicht (Man kann ja leider nicht mehrere Parameter an den Thread übergeben (schön wärs), ich weis, es gibt dafür Alternativen, aber möchte halt nicht so kompliziert machen).
Und das Beispiel von SimonSimCity find ich besser, weil ich dann für eine andere Variable an den Thread übergeben kann (Ohne Umwege).

Verfasst: 17.09.2007 19:12
von Kaeru Gaman
wie ich sagte
Kaeru Gaman hat geschrieben:nur dass das flag global gewählt wurde, und nicht byREF übergeben wird.
..und trotzdem solltest du ne LONG als Flag nehmen, kein string.

Verfasst: 17.09.2007 19:31
von RSBasic
@Kaeru Gaman
>..und trotzdem solltest du ne LONG als Flag nehmen, kein string.
OK, werde ich dann später ändern.

Wieso ist überhaupt Long als Flag so wichtig?
Wieso kann das keine normale Variable (ganze Zahlen) sein?

Verfasst: 17.09.2007 19:34
von edel
Der Code von SimonSimCity schmiert frueher oder spaeter ab.
Dann doch lieber der von NicTheQuick oder HeX0R, der funktioniert
naemlich richtig.

Verfasst: 17.09.2007 19:34
von a14xerus
RSBasic hat geschrieben:Wieso ist überhaupt Long als Flag so wichtig?
Wieso kann das keine normale Variable (ganze Zahlen) sein?
Longs sind doch ganze Zahlen :?

Verfasst: 17.09.2007 19:41
von Kaeru Gaman
edel hat geschrieben:Der Code von SimonSimCity schmiert frueher oder spaeter ab.
schreib mal bitte genauer, wo du da die gefährdung siehst.
interessiert mich auch, und ich hab im moment keine zeit, das detailliert durchzuackern...

Verfasst: 17.09.2007 19:47
von edel
Die Funktion nutzt stdcall, das heisst die Funktion raeumt den
Stack selber auf. Bei dem Funktionsaufruf wird etwas auf den
Stack gepusht, da aber die Funktion keine Werte annimmt,
wird auch nichts gesaeubert und duerfte frueher oder spaeter
abschmieren.

Da braucht man nix 'durchzuackern', da reicht ein Blick auf
die Threadfunktion.