Seite 1 von 3

Fenster unabhängig vom eigenen Prozess machen

Verfasst: 05.12.2006 18:33
von Xaby
Hallo Fans

folgendes:

Mein Programm hat nur einen Knopf, der was wirklich tut.
Er heißt ,,MACHEN !!!,,

Wenn man den klickt, tut das Programm, was ihm aufgetragen wurde.
Es liest eine große Anzahl an Dateien von der Festplatte ein.

Nun mein Problem, ich kann mein Fenster wärend das Programm die Daten auf der Platte durchsucht nicht mehr verschieben oder kleiner machen.

Das ist etwas ungünstig.

Ich denke, es hängt damit zusammen, dass mein Programm aus dem Main-Loop in eine andere Prozedure gegangen ist und erst wieder in den Main-Loop zurück kehrt, bis die Suche vorbei ist.

Müsste ich meine Dateisuche in einem eigenen Thread starten?
Oder einfach zwischen den Schleifen mal ein WindowEvent()
abfragen?

Ha jemand konstruktive Vorschläge?

Sagen wir so:

Code: Alles auswählen

;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Button_0
EndEnumeration

Procedure Mache()
   Repeat
      Debug "tue"
   Until 0=1
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") 
    EndIf
  EndIf
EndProcedure

;/ Haupt

Open_Window_0()
Repeat
   Event = WaitWindowEvent()

   If Event=#PB_Event_Gadget
     If EventGadget()=#Button_0
        Mache()
     EndIf
   EndIf

Until Event=#PB_Event_CloseWindow

Anfangs wird es auch nicht selbst wieder gezeichnet. Aber nach einer Weile geht es wieder. Aber nicht, wenn Windows nicht gleich merkt, was los ist und die Schleife ein bisschen mehr macht.

:roll:

Verfasst: 05.12.2006 19:45
von Fluid Byte
Die Lösung heißt Threads! Diese laufen unabhängig vom eigenen Hauptprogramm und sind damit ideal for alle Arten von Hintergrund Prozessen.

Check mal die PB Hilfe über Threads. Ich glaube dazu muß ich nicht viel sagen da das erstellen von Threads recht simpel ist.

Verfasst: 06.12.2006 02:02
von Xaby
Okay, überzeugt :mrgreen:

Also dann:

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=1or Paul
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

Verfasst: 06.12.2006 02:09
von edel
Das sollte dann aber CreateThread(@Mache() ,0) heissen.

Verfasst: 06.12.2006 10:20
von Kaeru Gaman
außerdem sollte man code in code-tags setzen, und net grün.
mensch, Folker, das is doch nich dein erster tag im forum,
das müsstest du doch langsam wissen.

Verfasst: 06.12.2006 10:57
von Xaby
@ Kaeru
Siehst doch oben, dass ich es kann :mrgreen:

Ja, fehlt ein @.


Dann sag mal, wie ich, wenn ich [ code ] ... [ / code ] benutze, diese Zeile hervorheben kann.

Code: Alles auswählen

Hallo
[b]Gutenmorgen[/b]
Tach

Verfasst: 06.12.2006 11:05
von edel
Ja, fehlt ein @.
[...]
CreateThread(Mache()@ ,0)
Betrunken ? :lol:

Verfasst: 06.12.2006 11:14
von Kaeru Gaman
> Dann sag mal, wie ich, wenn ich [ code ] ... [ / code ] benutze, diese Zeile hervorheben kann.

garnicht!
aber einrückungen und lesbarkeit sind imho weit wichtiger als farbliche hervorhebungen.

du Spielratz ;)

Ihr seid ja schon früh auf

Verfasst: 06.12.2006 11:20
von Xaby
Was sagt ihr?

Jetzt wäre es ein Beispiel für das CODEARCHIVE :? :o :shock: :D

:allright:

Verfasst: 06.12.2006 11:21
von Kaeru Gaman
kann ich nicht beurteilen. ich seh dar nur nen gummibärchen-text, keinen code. ;)