Wie baut man einen Thread richtig auf?

Anfängerfragen zum Programmieren mit PureBasic.
Re42
Beiträge: 91
Registriert: 08.11.2020 23:41

Wie baut man einen Thread richtig auf?

Beitrag 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.
Zuletzt geändert von Re42 am 22.09.2022 16:01, insgesamt 1-mal geändert.
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Wie baut man einen Thread richtig auf?

Beitrag 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.
Zuletzt geändert von jacdelad am 22.09.2022 13:45, insgesamt 1-mal geändert.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Re42
Beiträge: 91
Registriert: 08.11.2020 23:41

Re: Wie baut man einen Thread richtig auf?

Beitrag 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?
Zuletzt geändert von Re42 am 22.09.2022 13:38, insgesamt 1-mal geändert.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Wie baut man einen Thread richtig auf?

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Wie baut man einen Thread richtig auf?

Beitrag 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.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Re42
Beiträge: 91
Registriert: 08.11.2020 23:41

Re: Wie baut man einen Thread richtig auf?

Beitrag von Re42 »

Danke für die weiteren Erklärungen und vor allem auch für das Code-Beispiel. Ich versuche, weiterzukommen.
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Wie baut man einen Thread richtig auf?

Beitrag 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.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Wie baut man einen Thread richtig auf?

Beitrag 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.
Bild
Re42
Beiträge: 91
Registriert: 08.11.2020 23:41

Re: Wie baut man einen Thread richtig auf?

Beitrag 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.
Benutzeravatar
jacdelad
Beiträge: 341
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Wie baut man einen Thread richtig auf?

Beitrag von jacdelad »

Wie blockiert? Dein Hauptthread, hängt ja weiterhin in der Ereignisschleife. Sollte er jedenfalls.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Antworten