Aktuelle Zeit: 18.06.2019 23:30

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Arbeiten mit Threads
BeitragVerfasst: 20.05.2019 08:49 
Offline

Registriert: 26.04.2019 10:31
Wohnort: Mühldorf am Inn
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...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Arbeiten mit Threats
BeitragVerfasst: 20.05.2019 09:33 
Offline
Admin
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Deutschland::Berlin()
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.

_________________
BildBildBildBildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Arbeiten mit Threads
BeitragVerfasst: 20.05.2019 11:55 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
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:
;-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 EventDesigner v1.x / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Arbeiten mit Threads
BeitragVerfasst: 21.05.2019 09:09 
Offline
Benutzeravatar

Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten
Hallo Kurt,

Code:
; 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ß

_________________
PB Spickzettel

Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im sichtbaren Universum.
Bitte Frage fragen.
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Arbeiten mit Threads
BeitragVerfasst: 21.05.2019 21:35 
Offline

Registriert: 26.04.2019 10:31
Wohnort: Mühldorf am Inn
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...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Arbeiten mit Threads
BeitragVerfasst: 21.05.2019 22:30 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
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 EventDesigner v1.x / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Arbeiten mit Threads
BeitragVerfasst: 22.05.2019 14:09 
Offline
Benutzeravatar

Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten
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ß


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Arbeiten mit Threads
BeitragVerfasst: 22.05.2019 19:55 
Offline

Registriert: 26.04.2019 10:31
Wohnort: Mühldorf am Inn
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...


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye