Fenster unabhängig vom eigenen Prozess machen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Das selbe in grün

Code: Alles auswählen

Global Paul.b 
;- Window Constants 

; 
Enumeration 
  #Window_0 
EndEnumeration 

;- Gadget Constants 
; 
Enumeration 
  #Button_0 
EndEnumeration 

Procedure Mache() 
  Paul=0 

  Repeat 
     Debug "tue" 
     delay(10) 
   Until 0=1 or Paul ; schon komisch, dabei dürfen doch Variablen nicht mit einer Zahl anfangen.
EndProcedure 

Procedure Open_Window_0() 
  If OpenWindow(#Window_0, 379, 170, 146, 67, "Dings",#PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) 
     If CreateGadgetList(WindowID(#Window_0)) 
       ButtonGadget(#Button_0, 10, 10, 120, 40, "Mache",#PB_Button_Toggle) 
     EndIf 
  EndIf 
EndProcedure 

;/ Haupt 

  Open_Window_0() 
  Repeat 
    Event = WaitWindowEvent() 

    If Event=#PB_Event_Gadget 
      If EventGadget()=#Button_0 
        If IsThread( Thread) 
          Paul=1 
        Else 
          Thread= CreateThread(@Mache() ,0) 
        EndIf 
      EndIf 
    EndIf 

  Until Event=#PB_Event_CloseWindow
Sollten einen Vote starten, wem was lieber ist.
Ohne bunte Schrift weiß man doch wieder nicht, was gemeint ist.
Und für Anfänger dann zu unübersichtlich. :roll: /:->

:allright:
Zuletzt geändert von Xaby am 07.12.2006 00:08, insgesamt 2-mal geändert.
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

nuja.. der sinn der Code-Tags ist ja eigentlich, dass die Einrückungen erhalten bleiben.

ich hab also den code mal in meine IDE gepatcht,
und nun seh ich da etwas sehr seltsames:

Code: Alles auswählen

  Until 0=1or Paul 
was soll das bedeuten?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Im ersten Teil war die Prozedur

Code: Alles auswählen

Repeat
  Debug Tue
Until 0=1
Um hier nicht weiter zu verwirren, hab ich ein Or rein gemacht.

Denn irgendeine Abbruchbedingung muss ja angegeben werden, auch wenn die nicht zutreffen kann.
>>Achso hab ich ja auch blau gemacht, damit gleich einer wie du Fragen stellt. Legende fehlt wohl noch. Wollte mit blau sagen, dass man es weglassen kann <)

Und wenn Paul beim zweiten Drücken des Knopfes gesetzt wird, wird die Schleife beendet. Sauberes Beenden des Threads ohne KillThread.

:allright:
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

für abbruchbedingungen die keine sind, kann man auch

Code: Alles auswählen

Repeat
ForEver
verwenden, doch das nur am rande.

> Ohne bunte Schrift weiß man doch wieder nicht, was gemeint ist.
> Und für Anfänger dann zu unübersichtlich.

das liegt weniger an dem fehlen der bunten schrift, als an Paul und Tu und Mache.....

ich war mal so frei und hab mal CODE draus gemacht. ;) *neck*

Code: Alles auswählen

Global Stop_Thread.b 

;- Window Constants 
Enumeration 
  #Window_0 
EndEnumeration 

;- Gadget Constants 
Enumeration 
  #Button_ToggleThread 
EndEnumeration 

;- The Demo Thread
Procedure Demo_Thread() 
  Static count.b
  Stop_Thread = 0 
  Repeat 
    Debug "Active -" +Str(count)
    count +1
    Delay(200) 
  Until Stop_Thread 
EndProcedure 

;- Main Window
If OpenWindow(#Window_0, 0, 0, 180, 60, "Thread Demo", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered ) 
  If CreateGadgetList(WindowID(#Window_0)) 
    ButtonGadget(#Button_ToggleThread, 10, 10, 160, 40, "Toggle Thread",#PB_Button_Toggle) 
  EndIf 
EndIf 

;- Main Loop
Repeat 
  Event = WaitWindowEvent() 
  If Event = #PB_Event_Gadget 
    If EventGadget() = #Button_ToggleThread 
      If IsThread(Thread_ID) 
        Stop_Thread = 1 
      Else 
        Thread_ID = CreateThread(@Demo_Thread() ,0) 
      EndIf 
    EndIf 
  EndIf 
Until Event = #PB_Event_CloseWindow
edith
> Um hier nicht weiter zu verwirren, hab ich ein Or rein gemacht.
dir ist aber schon bewusst, das zwischend er ersten bedingung und dem Or ein Leerzeichen sein muss? ;)
läßt du deinen code eigentlich wenigstens 1x laufen bevor du ihn postest. ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Repeat

ForEver ...

ist ja für einen Thread, der irgendwann sterben soll nicht zu gebrauchen!

Also nicht immer den Larry raushängen lassen und keiner sein :mrgreen:



Und zu Paul und anderen Konsorten. Mach dich frei von Bezeichnungen, dadurch lernst du Fehler zu finden.

Schau mal: 187-5=Paul
Wie groß ist Paul :wink:

>> Apropo, ist dir bewusst, dass auch Kaerus nicht vollkommen fehlerlos sind :?

Lass uns nicht streiten, wir sollten uns gegenseitig lieber geistig befruchten und knuddeln und liebhaben :allright:
Kinder an die Macht http://scratch.mit.edu/
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Also nicht immer den Larry raushängen lassen und keiner sein

nö, ich bin ja auch kein Larry... ;)

verdreh nicht die sache sinnlos.

du hast Until 0=1 gewählt, um die schleife beliebig weiterlaufen zu lassen.
mein argument: unnütz, mach gleich ForEver.

> ist ja für einen Thread, der irgendwann sterben soll nicht zu gebrauchen!
ja schick, hast du aber nix von gesagt in diesem zusammenhang.

> Mach dich frei von Bezeichnungen, dadurch lernst du Fehler zu finden.
keine frage.
aber dein 0/1-verwechslungs-fehler wäre dir wohl kaum unterlaufen,
wenn du die bezeichnung Stop_Thread gewählt hättest.
ganz ehrlich:
ich hatte beim umstellen des codes auch erst eine andere bezeichnung gewählt,
weil man spontan davon ausgeht, dass ein steuer-flag im zustand 1 "eingeschaltet" bedeutet.
allein die deutliche bezeichnung Stop_Thread verhindert diesen irrtum.

> wir sollten uns gegenseitig lieber geistig befruchten und knuddeln und liebhaben
ersteres tun wir, mittleres muss nich sein, letzteres ist ja wohl zumindest teilweise der fall, sonst würde ich dir ja kaum antworten. ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

@Xaby und Kaeru Gaman

Kleiner Verbesserungsvorschlag:
Ihr prüft beide mit If, ob Fenster und Gadget-Liste geöffnet werden konnten, was ja auch OK ist:

Code: Alles auswählen

;- Main Window 
If OpenWindow(#Window_0, 0, 0, 180, 60, "Thread Demo", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered ) 
  If CreateGadgetList(WindowID(#Window_0)) 
    ButtonGadget(#Button_ToggleThread, 10, 10, 160, 40, "Toggle Thread",#PB_Button_Toggle) 
  EndIf 
EndIf 

;- Main Loop 
Repeat 
  Event = WaitWindowEvent() 
  If Event = #PB_Event_Gadget 
    If EventGadget() = #Button_ToggleThread 
      If IsThread(Thread_ID) 
        Stop_Thread = 1 
      Else 
        Thread_ID = CreateThread(@Demo_Thread() ,0) 
      EndIf 
    EndIf 
  EndIf 
Until Event = #PB_Event_CloseWindow
Aber unabhängig vom Ergebnis läuft Euer Programm in die dann folgende Repeat-Until Schleife, also auch dann, wenn das Fenster oder die Gadget-Liste nicht geöffnet werden konnten (was zugegeben sehr unwahrscheinlich ist). Aber wenn man diesen Test macht, dann sollte man die nachfolgende Repeat-Until Schleife auch nur bei positivem Ergebnis ausführen:

Code: Alles auswählen

;- Main Window 
If OpenWindow(#Window_0, 0, 0, 180, 60, "Thread Demo", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered ) 
  If CreateGadgetList(WindowID(#Window_0)) 
    ButtonGadget(#Button_ToggleThread, 10, 10, 160, 40, "Toggle Thread",#PB_Button_Toggle) 
    ;- Main Loop 
    Repeat 
      Event = WaitWindowEvent() 
      If Event = #PB_Event_Gadget 
        If EventGadget() = #Button_ToggleThread 
          If IsThread(Thread_ID) 
            Stop_Thread = 1 
          Else 
            Thread_ID = CreateThread(@Demo_Thread() ,0) 
          EndIf 
        EndIf 
      EndIf 
    Until Event = #PB_Event_CloseWindow
  EndIf 
EndIf 
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

yo is kla.

ich hab die 5 zeilen lediglich aus Xabies Procedure rausgepatcht.
wenn ich sowas selber schreib, sieht das normal so aus:

Code: Alles auswählen

If Not OpenWindow(#Window_0, 0, 0, 180, 60, "Thread Demo", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered ) 
  End
EndIf 
If Not CreateGadgetList(WindowID(#Window_0)) 
  End
EndIf
ButtonGadget(#Button_ToggleThread, 10, 10, 160, 40, "Toggle Thread",#PB_Button_Toggle)
Message-Requester ist hier nicht unbedingt vonnöten.
Zuletzt geändert von Kaeru Gaman am 07.12.2006 13:40, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag von Shardik »

Kaeru Gaman hat geschrieben: ich hab die 5 zeilen lediglich aus Xabies Procedure rausgepatcht.
Das hatte ich mir schon gedacht :wink:

In Deinem neuen Beispiel hast Du bei If CreateGadgetList(WindowID(#Window_0)) hinter If das Not vergessen. Außerdem wirst Du wahrscheinlich im Fehlerfall auch noch eine Fehlermeldung ausgeben... (Bitte entschuldige meine Kleinlichkeit, aber das ist hier schließlich das Anfängerforum) :twisted:
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> hinter If das Not vergessen.
yup, ergänzt.

> Außerdem wirst Du wahrscheinlich im Fehlerfall auch noch eine Fehlermeldung ausgeben...

normalerweise ja, aber:
wenn er kein fenster oder keine gadgetlist erstellen kann,
wie soll er dann einen messagerequester erstellen? ;)

wie soll man also im falle eines fehlers dort einen requester ausgeben?

andersherum:
wie soll dort ein fehler auftreten, wenn man im befehl selber nicht maßgeblich was falsch geschrieben hat?

also, ich stell hier wirklich mal die kernfrage:
was soll man machen, wenn das proggi kein fenster öffnen kann?
am besten doch komplett abbrechen,
evtl. noch den *FAILED* sound ausgeben,
ggf. eine error-API anspringen und es windows überlassen,
ob es ein fehlermeldungsfenster öffnen kann oder lieber selbstmord begeht...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten