Arbeiten mit Threads

Anfängerfragen zum Programmieren mit PureBasic.
Sommertv
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

Beitrag von Sommertv »

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
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Arbeiten mit Threats

Beitrag von RSBasic »

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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Arbeiten mit Threads

Beitrag von mk-soft »

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

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
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: Arbeiten mit Threads

Beitrag von juergenkulow »

Hallo Kurt,

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
Gruß
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
Sommertv
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

Beitrag von Sommertv »

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)
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Arbeiten mit Threads

Beitrag von mk-soft »

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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: Arbeiten mit Threads

Beitrag von juergenkulow »

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ß
Sommertv
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

Beitrag von Sommertv »

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"
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
Antworten