Ein zweites Fenster vom Thread schließen [X]

Anfängerfragen zum Programmieren mit PureBasic.
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag 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:
Benutzeravatar
SimonSimCity
Beiträge: 132
Registriert: 14.01.2007 00:49

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag 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).
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag 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?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Der Code von SimonSimCity schmiert frueher oder spaeter ab.
Dann doch lieber der von NicTheQuick oder HeX0R, der funktioniert
naemlich richtig.
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag 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 :?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Antworten