Wie lasse ich Prozeduren parallel laufen?

Anfängerfragen zum Programmieren mit PureBasic.
shoam
Beiträge: 4
Registriert: 13.08.2005 22:06

Wie lasse ich Prozeduren parallel laufen?

Beitrag von shoam »

Hallo zusammen!

Prozeduren sind doch dafür da damit sie parallel laufen? Oder?
Bei mir klappt das irgendwie nicht.
Wenn ich das wie folgt eingebe passiert mit drücken von F5 gar nichts.

Code: Alles auswählen

Procedure a()
   delay(1000)
   Debug "Procedure a()"
EndProcedure

Procedure b()
  delay(500)
  Debug "Procedure b()"
  delay(2000)
  Debug "Procedure ()"
EndProcedure
Erst wenn ich eine Procedure aufrufe z.B. mit
a()
b()
dann starten sie aber dann laufen sie wieder nicht parallel.
Könnt ihr mir ein wenig auf die Sprünge helfen, wie ich es schaffe
die beiden parallel ablaufen zu lassen?

Merci Alex
Benutzeravatar
vonTurnundTaxis
Beiträge: 2130
Registriert: 06.10.2004 20:38
Wohnort: Bayreuth
Kontaktdaten:

Beitrag von vonTurnundTaxis »

Du kannst Threads erstellen:

Code: Alles auswählen

Procedure a(Parametera)
   Debug "Procedure a()"
EndProcedure

Procedure b(Parameterb)
  Debug "Procedure b()"
EndProcedure

CreateThread(@a(), Parametera)
CreateThread(@b(), Parameterb)
Delay(1000)

Threads sind in PureBasic leider nicht sicher, es kann also zu Abstürzen kommen.
Versuche am Besten, darum herum zu kommen.
Nicht durch Zorn, sondern durch Lachen tötet man
ClipGrab | Pastor - jetzt mit kurzen URLs!
shoam
Beiträge: 4
Registriert: 13.08.2005 22:06

Beitrag von shoam »

Code: Alles auswählen

CreateThread(@a(), Parametera)
CreateThread(@b(), Parameterb)
Delay(1000)
Mmhh... ich habe nun diese 2 Zeilen meinem code hinzugefügt, aber dies läuft immer noch nicht. Stimmt vileicht was anderes nicht.
Wenn ich compile/run ausführe blitzt schnell die Debug Umgebung auf und verschwindet soeben wieder.
Eigentlich müsste das doch so funktionieren oder?

gruss alex
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

zeig mal den ganzen Code.
Bild
shoam
Beiträge: 4
Registriert: 13.08.2005 22:06

Beitrag von shoam »

Hier wäre mein Code, bitte nicht lachen ;)

Es geht darum nach einer gewissen zeit ein Programm zu starten.
Wobei man es auch stoppen kann(muss noch programmiert werden)

desshalb wollte ich 2 prozeduren nehmen

Code: Alles auswählen

Declare _Open_Window_0()
Declare _a()
  #Window_0      = 0
  #Image_0       = 1
  #ProgressBar_2 = 2
  #Button_0      = 3
  #Text_2        = 4

;- Fonts
;
Global FontID1
FontID1 = LoadFont(1, "Arial", 12, #PB_Font_Italic)

;- Image Globals
Global Image0
;- Catch Images
Image0 = CatchImage(0, ?Image0)
;- Images
DataSection
Image0:
  IncludeBinary "D:\HMI_FILES\program\L_HSR_03.bmp"
EndDataSection
 
 Procedure _a()
 Debug "atart delay"
 Delay(5000)
 Debug "start program"
 RunProgram("d:\HMI_Files\script\protool.vbs","", "d:")
 EndProcedure  

Procedure _Open_Window_0()
  If OpenWindow(0, 0, 0, GetSystemMetrics_(#SM_CXSCREEN), GetSystemMetrics_(#SM_CYSCREEN), #PB_Window_BorderLess | #PB_Window_ScreenCentered, "Borderless Window")
    If CreateGadgetList(WindowID())
      ImageGadget(#Image_0, 245, 160, 284, 95, Image0, #PB_Image_Border)
      ProgressBarGadget(#ProgressBar_2, 245, 260, 288, 13, 0, 10)
      ButtonGadget(#Button_0, 340, 310, 93, 35, "STOP !")
      TextGadget(#Text_2, 245, 280, 291, 20, "Please wait, while machine is starting up!")
      SetGadgetFont(#Text_2, FontID1)
    EndIf
  EndIf
 AddKeyboardShortcut(0, #PB_Shortcut_Escape, 1)  
 Repeat : WaitWindowEvent() : Until EventMenuID() = 1
 Debug "end"
EndProcedure
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Wer wird den hier lachen ;)? Wenn du den Code postet, kannst du nur
dir selbst helfen, da wir den Fehler besser aus machen könne. Paar
hundert Augen sehen mehr als 2 ;).

Naja... Also du musst die Prozeduren auch aufrufen. Das weißt du doch
hoffentlich, oder? Zudem würde ich dir davon abraten mit Threads zu
arbeiten, da diese weit mehr als unsicher sind - leider.
Bild
shoam
Beiträge: 4
Registriert: 13.08.2005 22:06

Beitrag von shoam »

Ja das dachte ich auch, aber wie rufe ich die auf damit sie parallel ablaufen?
Geht das nur mit Thread's?

gruss alex
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Eine Funktion rufst du mit

Code: Alles auswählen

_Open_Window_0()
auf o_O. Und Parallele Ausführung geht nur
mit Threads.
Bild
merlin
Beiträge: 157
Registriert: 30.07.2005 22:15

Re: Wie lasse ich Prozeduren parallel laufen?

Beitrag von merlin »

shoam hat geschrieben:Hallo zusammen!
Prozeduren sind doch dafür da damit sie parallel laufen? Oder?
Bei mir klappt das irgendwie nicht.
Hallo! Proceduren sind nicht dazu da, um mehrere proceduren etc paralell auszuführen... um mehrere routinen (gerne auch proceduren) parallel laufen zu lassen, benutzt man threads..

Also proceduren sind eigentlich hautpsächlich dafür da, um komplette routinen (die man immer wieder verwenden kann... ggfl. nur mit ein paar anderen parameterübergaben), nur einmal zu schreiben und immer wieder bei bedarf aufzurufen... (was für ein schlimmer satz, lach)
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Natürlich sind Proceduren auch dazu da um mehrere Aufgaben gleich-
zeitig auszuführen. Oder was willst du bitte an CreateThread übergeben,
wenn du der Meinung bist, dass man Proceduren nicht für Threads nutzen
sollte /:-> ?

Das einzige Problem mit Threads ist aber nun mal, dass sie sehr unsicher
sind. Bei Threads kann es ganz leicht mal zu abstürzen des Programms
kommen. Am besten ist es, wenn du mal nach Threads hier im Board
suchst. Da wirst du einen ganzen Haufen an Themen finden, die das
Problem mit Threads ansprechen.
Bild
Antworten