Arbeiten mit Threads
-
- Beiträge: 68
- Registriert: 26.04.2019 10:31
- Computerausstattung: Lenovo W500, Debian Stable, Purebasic 5.70 (momentan die Testversion)
- Wohnort: Mühldorf am Inn
Arbeiten mit Threads
Guten Morgen,
ich hätte gerne ein paar einfache Beispiele wie man Threats definiert, aufruft, Variablen abfängt und wieder beendet.
Aus den Beispielen und anderen Programmen werd ich net schlau, da heisst's immer nur "definiert das und das und gibt das und das zurück"
aber nirgends erklärt wie das ganze verkettet wird.
Soweit hab ich mich schon rein gelesen, dass der Threat Abschnitt in einer Prozedur abläuft.
Ein gutes Beispiel wäre z.B. 2 oder 3 unabhängige Schleifen die in den Threats ablaufen, dort z.B Variable threat1 threat2 usw an die Hauptschleife zurück geben.
Danke im Vorab
Kurt
ich hätte gerne ein paar einfache Beispiele wie man Threats definiert, aufruft, Variablen abfängt und wieder beendet.
Aus den Beispielen und anderen Programmen werd ich net schlau, da heisst's immer nur "definiert das und das und gibt das und das zurück"
aber nirgends erklärt wie das ganze verkettet wird.
Soweit hab ich mich schon rein gelesen, dass der Threat Abschnitt in einer Prozedur abläuft.
Ein gutes Beispiel wäre z.B. 2 oder 3 unabhängige Schleifen die in den Threats ablaufen, dort z.B Variable threat1 threat2 usw an die Hauptschleife zurück geben.
Danke im Vorab
Kurt
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
Re: Arbeiten mit Threats
Wenn du mehrere Threads laufen lassen möchten, die auf gemeinsame Variablen zugreifen, dann sind Mutex und Semaphore sehr wichtig.
Einfach mal in der PB-Hilfe nach CreateMutex und CreateSemaphore suchen. Da gibt es passende Beispielcodes.
Einfach mal in der PB-Hilfe nach CreateMutex und CreateSemaphore suchen. Da gibt es passende Beispielcodes.
Re: Arbeiten mit Threads
Edit
1. Threads laufen asynchron zu deinen Hauptprogramm.
2. Beim erstellen des Thread wird immer ein Parameter mit übergeben.
3. Dieser Parameter kann auch ein Pointer auf eine Struktur sein.
4. KillThread nur verwenden, wenn der Thread sich aufgehängt hat. Also nur im Notfall.
5. PauseThread hält den Thread irgendwo an. Besser eine Steuervariable nehmen.
6. Immer Compiler-Option "Thread-sicheres Executbale erstellen" verwenden.
7. Das anlegen und ändern von Gadget aus Threads ist unter Linux und macOS nicht möglich (Crash)
* Um allen die Arbeit zu erleichtern habe ich ein Module geschrieben um Gadget aus Threads zu ändern.
- Purebasic ermöglicht mit den Befehl PostEvent eigene Events an das Hauptprogramm zu senden.
- Du must noch nicht verstehen wie dort alles funktioniert, empfehle aber das Module zu nehmen.
Link ThreadToGUI: viewtopic.php?f=8&t=29728
1. Threads laufen asynchron zu deinen Hauptprogramm.
2. Beim erstellen des Thread wird immer ein Parameter mit übergeben.
3. Dieser Parameter kann auch ein Pointer auf eine Struktur sein.
4. KillThread nur verwenden, wenn der Thread sich aufgehängt hat. Also nur im Notfall.
5. PauseThread hält den Thread irgendwo an. Besser eine Steuervariable nehmen.
6. Immer Compiler-Option "Thread-sicheres Executbale erstellen" verwenden.
7. Das anlegen und ändern von Gadget aus Threads ist unter Linux und macOS nicht möglich (Crash)
* Um allen die Arbeit zu erleichtern habe ich ein Module geschrieben um Gadget aus Threads zu ändern.
- Purebasic ermöglicht mit den Befehl PostEvent eigene Events an das Hauptprogramm zu senden.
- Du must noch nicht verstehen wie dort alles funktioniert, empfehle aber das Module zu nehmen.
Link ThreadToGUI: viewtopic.php?f=8&t=29728
Code: Alles auswählen
;-TOP
CompilerIf #PB_Compiler_Thread = 0
CompilerError "Compiler-Option Threadsafe einschalten"
CompilerEndIf
; Threads
; Status des Threads
Enumeration
#TH_StartUp
#TH_Running
#TH_Shutdown
#TH_Finished
EndEnumeration
; Struktur der Daten für den Thread
Structure udtThreadData
; Header
ThreadID.i
Cmd.i
State.i
Exit.i
; Daten
Max.i
Counter.i
EndStructure
; Thread mit den Parameter den Pointer auf die Daten
Procedure thMyThread(*data.udtThreadData)
With *data
\State = #TH_StartUp
;TODO
\State = #TH_Running
While Not \Exit
\Counter + 1
If \Counter = \Max
Break
EndIf
Delay(100)
Wend
\State = #TH_Shutdown
;TODO
\State = #TH_Finished
EndWith
EndProcedure
; Globale Daten anlegen
Global.udtThreadData th1, th2, th3
; Werte setzen
th1\Max = 50
th2\Max = 100
th3\Max = 30
; Threads starten
th1\ThreadID = CreateThread(@thMyThread(), th1)
th2\ThreadID = CreateThread(@thMyThread(), th2)
th3\ThreadID = CreateThread(@thMyThread(), th3)
; Warten auf Threads
Repeat
If th1\State = #TH_Finished
; Thread 2 abbrechen, wenn Thread 1 fertig
th2\Exit = #True
EndIf
Delay(100)
Until th1\State = #TH_Finished And th2\State = #TH_Finished And th3\State = #TH_Finished
; Daten ausgeben
Debug th1\Counter
Debug th2\Counter
Debug th3\Counter
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- juergenkulow
- Beiträge: 188
- Registriert: 22.12.2016 12:49
- Wohnort: :D_üsseldorf-Wersten
Re: Arbeiten mit Threads
Hallo Kurt,
Gruß
Code: Alles auswählen
; ErsterThread, ZweiterThread und Hauptprogramm laufen gleichzeitig.
CompilerIf #PB_Compiler_Thread=#False : CompilerError "Compiler Optionen Thread sicher einstellen." :CompilerEndIf
Procedure ErsterThread(*ptr.Integer)
Protected j
For j=1 To 10
*ptr\i=j
Debug " ErsterThread:"+Str(j)+" "+Str(*ptr\i)
Delay(1000)
Next
Debug "Auf dem Stack von ErsterThread:"+Hex(@j)
EndProcedure
Procedure ZweiterThread(*ptr.Integer)
Protected k
For k=2 To 10 Step 2
*ptr\i=k
Debug " ZweiterThread:"+Str(k)+" "+Str(*ptr\i)
Delay(2000)
Next
Debug "Auf dem Stack von ZweiterThread:"+Hex(@k)
EndProcedure
Procedure Hauptprogramm()
Protected l, Haupt1, Haupt2
CreateThread(@ErsterThread(), @Haupt1)
CreateThread(@ZweiterThread(),@Haupt2)
For l=1 To 12
Debug "Hauptprogramm:"+ Str(l)+" "+Str(Haupt1)+" "+Str(Haupt2)
Delay(1000)
Next
Debug "Auf dem Stack vom Hauptprogramm: "+Hex(@l)+" "+Hex(@Haupt1)+" "+Hex(@Haupt2)
EndProcedure
Hauptprogramm()
End
; ErsterThread:1 1
; Hauptprogramm:1 1 0
; ZweiterThread:2 2
; ErsterThread:2 2
; Hauptprogramm:2 2 2
; ErsterThread:3 3
; ZweiterThread:4 4
; Hauptprogramm:3 3 4
; ErsterThread:4 4
; Hauptprogramm:4 4 4
; ErsterThread:5 5
; ZweiterThread:6 6
; Hauptprogramm:5 5 6
; ErsterThread:6 6
; Hauptprogramm:6 6 6
; ErsterThread:7 7
; Hauptprogramm:7 7 6
; ZweiterThread:8 8
; ErsterThread:8 8
; Hauptprogramm:8 8 8
; ErsterThread:9 9
; ZweiterThread:10 10
; Hauptprogramm:9 9 10
; ErsterThread:10 10
; Hauptprogramm:10 10 10
; Auf dem Stack von ErsterThread:4B3FF48
; Auf dem Stack von ZweiterThread:4C3FF48
; Hauptprogramm:11 10 10
; Hauptprogramm:12 10 10
; Auf dem Stack vom Hauptprogramm: 12FF08 12FF10 12FF18
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.
Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
-
- Beiträge: 68
- Registriert: 26.04.2019 10:31
- Computerausstattung: Lenovo W500, Debian Stable, Purebasic 5.70 (momentan die Testversion)
- Wohnort: Mühldorf am Inn
Re: Arbeiten mit Threads
Hallo und erstmal dank an alle...
@ juergenkulow:
welche Bedeutung bzw was macht *ptr\i ?
Das wird doch in der Schleife mit 1-10 bzw 2,4,6... geladen, somit ist die Debug Ausgabe von str(j) bzw str(k) und str(*ptr\i) immer gleich.
Und warum ist dann der Stack von Threat1 nicht wie erwartet $0a (10dez = hex 0a)
@ juergenkulow:
welche Bedeutung bzw was macht *ptr\i ?
Das wird doch in der Schleife mit 1-10 bzw 2,4,6... geladen, somit ist die Debug Ausgabe von str(j) bzw str(k) und str(*ptr\i) immer gleich.
Und warum ist dann der Stack von Threat1 nicht wie erwartet $0a (10dez = hex 0a)
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
Re: Arbeiten mit Threads
Erst mal die Grundlagen von PureBASIC lernen.
Umgang mit Variablen: Global, Protected, Shared, etc
Dann den Umgang mit Pointern: *Pointer, Adresse auf eine Variable @Variable, Variablen.Typen, Variable.strukturen, *pointer.strukturen.
Sonderfall String, Pointer auf String, Pointer auf den Pointer von dem String.
F1 sollte weitgehend helfen.
PureBASIC ist eine der wenigen Sprachen wo es eine komplette deutsche Hilfe gibt. Sogar mit Einsteiger-Kapitel.
Umgang mit Variablen: Global, Protected, Shared, etc
Dann den Umgang mit Pointern: *Pointer, Adresse auf eine Variable @Variable, Variablen.Typen, Variable.strukturen, *pointer.strukturen.
Sonderfall String, Pointer auf String, Pointer auf den Pointer von dem String.
F1 sollte weitgehend helfen.
PureBASIC ist eine der wenigen Sprachen wo es eine komplette deutsche Hilfe gibt. Sogar mit Einsteiger-Kapitel.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- juergenkulow
- Beiträge: 188
- Registriert: 22.12.2016 12:49
- Wohnort: :D_üsseldorf-Wersten
Re: Arbeiten mit Threads
Hallo Kurt,
*ptr\i greift über einen Speicheradresszeiger auf einen Wert zu.
@j gibt die Speicheradresse von j an.
Dieses Programm zeigt das ein Thread-Programme mehere Stacks hat und einen Weg zur Rückgabe der Werte vom Stack ins Hauptprogramm.
Pure Basic-Hilfe Zeiger
Gruß
*ptr\i greift über einen Speicheradresszeiger auf einen Wert zu.
@j gibt die Speicheradresse von j an.
Dieses Programm zeigt das ein Thread-Programme mehere Stacks hat und einen Weg zur Rückgabe der Werte vom Stack ins Hauptprogramm.
Pure Basic-Hilfe Zeiger
Gruß
-
- Beiträge: 68
- Registriert: 26.04.2019 10:31
- Computerausstattung: Lenovo W500, Debian Stable, Purebasic 5.70 (momentan die Testversion)
- Wohnort: Mühldorf am Inn
Re: Arbeiten mit Threads
Danke schön...
das iss ein sehr interessantes Kapitel, iss ma ja schon fast auf Maschinenebene...
Kenne Pointer und Stacks noch von Assembler, aber davon hab ich mich vor einigen Jahren verabschiedet.
Hab nimmer die Geduld und Zeit für, naja was auch immer...
Aber es war eine schöne Zeit...
Vielleicht iss jemand aus der Szene hier und kennt die "BCS" ... dann schöne Grüsse von "CoalaBaer"
das iss ein sehr interessantes Kapitel, iss ma ja schon fast auf Maschinenebene...
Kenne Pointer und Stacks noch von Assembler, aber davon hab ich mich vor einigen Jahren verabschiedet.
Hab nimmer die Geduld und Zeit für, naja was auch immer...
Aber es war eine schöne Zeit...
Vielleicht iss jemand aus der Szene hier und kennt die "BCS" ... dann schöne Grüsse von "CoalaBaer"
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...