Seite 1 von 2
Wie lasse ich Prozeduren parallel laufen?
Verfasst: 13.08.2005 22:16
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
Verfasst: 13.08.2005 22:28
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.
Verfasst: 13.08.2005 22:36
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
Verfasst: 13.08.2005 22:37
von MVXA
zeig mal den ganzen Code.
Verfasst: 13.08.2005 22:45
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
Verfasst: 13.08.2005 22:52
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.
Verfasst: 13.08.2005 23:52
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
Verfasst: 14.08.2005 00:16
von MVXA
Eine Funktion rufst du mit
auf o_O. Und Parallele Ausführung geht nur
mit Threads.
Re: Wie lasse ich Prozeduren parallel laufen?
Verfasst: 14.08.2005 00:23
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)
Verfasst: 14.08.2005 02:11
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.