Seite 1 von 3

Wie baut man einen Thread richtig auf?

Verfasst: 22.09.2022 12:58
von Re42
Hallo, ich habe bisher noch nie einen Thread verwendet und das ist mir sowohl in der PB-Hilfe als auch sonst ein komplettes Rätsel. Wenn man eine normale Prozedur macht, sieht die z.B. so aus:

Code: Alles auswählen

Pocedure Prd()

…

EndProcedure
Wenn man dann einen Thread daraus machen will, muß die Procedure dann, falls ich das richtig verstanden habe, offensichtlich aussehen:

Code: Alles auswählen

Pocedure Prd(*x)
Das Problem: Die kann dann nicht mehr über Prd() aufgerufen werden, und wie geht das dann mit Threads? Mich würde auch mal interessieren, ob man einen Thread nur genau einmal aufrufen kann oder beliebig oft aus dem Code heraus. Danke für Info.

Edit: Mit dem Aufruf stand ich etwas auf dem Schlauch.

Re: Wie baut man einen Thread richtig auf?

Verfasst: 22.09.2022 13:16
von jacdelad
Es ist in der Hilfe eigentlich ordentlich erklärt. Hier mal die Grundlagen:
Eine Funktion, die in einem Thread laufen soll, hat immer einen Parameter und nie einen Rückgabewert. Der Parameter ist ein Integer, also geht auch eine Adresse zu einer Struktur, in der dann Werte zurückgegeben werden können.
Threads werden mittels CreateThread() gestartet.
Du kannst die Funktion, die für den thread vorgesehen ist, auch normal starten, dann läuft sie aber eben njcht parallel ab.

Wo genau liegt dein Problem? Die Hilfe erklärt es eigentlich sehr gut. Ich habe vor PureBasic mit etlichen Programmiersprachen gearbeitet, aber erst hier mit Threads angefangen. Der Einstieg war nicht schwer.

Re: Wie baut man einen Thread richtig auf?

Verfasst: 22.09.2022 13:26
von Re42
Ich hatte das alles gelesen, was in der Hilfe steht: Was ist denn überhaupt mit Rückgabewert gemeint? Der *Wert, den man da zuweist?

Re: Wie baut man einen Thread richtig auf?

Verfasst: 22.09.2022 13:38
von mk-soft
- Ein Thread Procedure hat immer ein Parameter. Einen Wert oder ein Zeiger auf Daten.
- Aktiviere im Compiler-Optionen immer 'Thhread-sicheres Executable erstellen'. Sonst probelme mit String , LinkedList, etc
- Ändere nie Windows und Gadgets vom Thread. Verwende PostEvent im Thread
- Verwende nicht KillThread zum beenden eines Threads (Nur wenn dieser abgestürzt ist)
- Vermeinde PauseThread und ResumeThread, da der Thread an undefinierter Stelle angehalten wird
- Verwende in der Endloss-Schleife im Thread ein kleinen Delay(10) um die Prozessor-Auslastung zu schonen

Siehe auch Mini Thread Control

P.S.
Bei CreateThread wird die Adresse der Thread Procedure übergeben. Eine Adresse einer Procedure erhält man mit @MyProcedure() ohne Angabe der Parameter.

Re: Wie baut man einen Thread richtig auf?

Verfasst: 22.09.2022 13:50
von jacdelad
Re42 hat geschrieben: 22.09.2022 13:26 Ich hatte das alles gelesen, was in der Hilfe steht: Was ist denn überhaupt mit Rückgabewert gemeint? Der *Wert, den man da zuweist?
Normalerweise funktioniert eine Funktion in etwa so

Code: Alles auswählen

Rückgabewert=Funktion(Parameter)
Das geht mit Threads nicht. Dort musst du es in etwa so machen (oder wie dein Programmablauf funktionieren soll):

Code: Alles auswählen

Global thread,Back

Procedure MyThread(*return)
  Delay(3000)
  PokeI(*return,2)
EndProcedure

thread=CreateThread(@MyThread(),@Back)
While IsThread(thread)
Delay(500)
Debug "Waiting"
Wend
Debug "Return Value: "+Back
Mit Threadsafe starten und bei Benutzung von Fenstern entsprechend die Events bearbeiten, siehe anderer Thread von dir.

Re: Wie baut man einen Thread richtig auf?

Verfasst: 22.09.2022 14:04
von Re42
Danke für die weiteren Erklärungen und vor allem auch für das Code-Beispiel. Ich versuche, weiterzukommen.

Re: Wie baut man einen Thread richtig auf?

Verfasst: 22.09.2022 14:39
von jacdelad
Die Arbeit mit Threads ist nicht wirklich schwer, solange du dich an die Grundregeln hältst, die mk-soft geschrieben hat. Die Kommunikation von Thread zu Thread oder Hauptprogramm ist nochmal eine kleine Herausforderung, aber wenn du das einnal gemacht hast ist das danach nur noch Wiederholung.

Re: Wie baut man einen Thread richtig auf?

Verfasst: 22.09.2022 15:20
von NicTheQuick
Was ihr alle noch nicht erwähnt habt, sind Dinge wie Mutexe und Semaphoren.
Ich bin der Meinung, dass es nicht so einfach ist mit Threads zu arbeiten. Darüber nachzudenken, was alles gleichzeitig passieren und sich in Quere kommen kann, kann ganz schönes Kopfzerbrechen bereiten. Womöglich wird einem das aber auch erst mit der Zeit klar.

Threads gehören definitiv zu den "advanced" Techniken. Gerade wenn man so roh wie bei Purebasic damit arbeiten muss und Dinge wie Bedingungsvariablen fehlen, ist das alles etwas nervig.

Re: Wie baut man einen Thread richtig auf?

Verfasst: 22.09.2022 15:36
von Re42
Die Sache hat noch einen weiteren Haken, denn, wenn der Thread läuft, ist das ScrollBarGadget blockiert. Oder kommt man da irgendwie raus?

Und noch etwas möchte ich schon lange beseitigen, auch wenn das jetzt nicht zum Thema gehört: Wie erreicht man in einer Procedure oder Subroutine, daß man auch dann das Fenster bewegen oder schließen kann? Das ist so häßlich, wenn dann jedesmal "Keine Rückmeldung" kommt. Es ist ja wahrscheinlich verpöhnt, Event = WaitWindowEvent(x) mehr als nur einmal in den Code zu schreiben.

Danke.

Re: Wie baut man einen Thread richtig auf?

Verfasst: 22.09.2022 16:10
von jacdelad
Wie blockiert? Dein Hauptthread, hängt ja weiterhin in der Ereignisschleife. Sollte er jedenfalls.