Variablen an Thread anhängen

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: Variablen an Thread anhängen

BeitragSa, Jun 05, 2010 21:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Gibt es die Möglichkeit verschiedene Variablen an einen Thread zu hängen? Das bräuchte ich für Funktionen die jeder Thread aufruft, in denen auf globale Variablen der Funktion zugegriffen werden. Ich könnte das jetzt mit einem Mutex lösen, aber die Threads sollen diese Funktion unabhängig von einander Aufrufen können. Ich könnte natürlich auch einfach in jeden Thread die Funktion reinkopieren. Dies führt allerdings zu einem unnötig großen Code und einer ungeschickten Datenredundanz. Ich könnte aber auch die benötigten Variable immer beim Funktionsaufruf mitgeben, was allerdings sehr umständlich ist (finde ich). Oder ich könnte einen eigenen Type machen, der alle Variablen der Funktion beinhalten und einen Verweis auf jeden Thread. Beim Aufruf einer Funktion sucht es dann den richtigen Eintrag raus. Das könnte sich allerdings extrem auf die Performance auswirken, da ich die Funktion sehr häufig verwende.

So das waren jetzt viele Möglichkeiten, die mir alle als nicht gut erscheinen. Habt ihr bessere Vorschläge, oder kann man tatsaächlich Variablen an einen Thread hängen. Die würde ich mir dann z.B. so vorstellen:
BlitzMax: [AUSKLAPPEN]
meineVarialbe = CurrentThread().meineVariable


MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

mpmxyz

BeitragSa, Jun 05, 2010 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Man kann bzw. muss einem Thread beim Erstellen ein Daten-Objekt zuteilen.
Dieses kannst du so programmieren, dass es z.B. threadsicher ist und alle nötigen Variablen enthält.
Das wäre die Lösung, die mir zu deinem pseudohaften Code einfällt.
Aus dem darüber stehenden Text wird mir leider nicht ganz klar, was du genau möchtest.
Falls ich deine Frage nicht ganz verstanden habe, brauche ich eine etwas klarere Aussage.
(Was braucht was, ist wo und was soll es machen?)
mfG
mpmxyz
Edit: Für den oben genannten Zugriff kannst du den Thread-Type auch erweitern.
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

BtbN

BeitragSa, Jun 05, 2010 22:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Les dir mal die doku zu TThreadData durch.

Der Eisvogel

BeitragSa, Jun 05, 2010 23:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Also nochmal zu Verdeutlichung:
Ich habe mehrer Threads, die alle auf eine Funktion, die im Hauptcode vorhanden ist zugreifen, die z.B. so aussieht:
BlitzMax: [AUSKLAPPEN]
Function FooBar()
Global meineVariable
meineVariable = Rand(0,99)
End Function


Wenn jetzt mehrere Threads gleichzeitig diese Funktion aufrufen, endet das in einem Crash, wegen des ungeschützen Speicherzugriffs. Da ich aber will, dass die Threads die Funktionen unabhängig voneinander aufrufen können, kann ich es nicht Mit Mutex machen.

Wie genau kann ich denn den Thread-Type erweitern? Steh ich grade auf dem Schlauch, oder ist das was, was man nicht wissen muss?

@BtbN: Also ich habe mir das jetzt durch gelesen, verstehe es aber nicht. Wie lege ich denn fest zu welchen Thread das ThreadData gehört? und wie Speichere ich jetzt z.B. einen Int darin. Ich bin grad irgendwie verwirrt.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

amon

BeitragSo, Jun 06, 2010 23:05
Antworten mit Zitat
Benutzer-Profile anzeigen
hi, wie schon mpmxyz erwähnt hat, kannst du ja beliebige objekte beim aufruf des threads mit übergeben - was du da reinschiebst liegt bei dir - hier ein kurzes beispiel:

Code: [AUSKLAPPEN]


SuperStrict

Type TTestType

   Field text:String

   Method GetText:String()
      Return text
   EndMethod
   
   Method SetText(text:String)
      Self.text = text
   EndMethod
   
   Function Create:TTestType(text:String)
      Local t:TTestType = New TTestType
      t.text = text
      Return t
   EndFunction
      
EndType

Function ThreadFunction:Object(data:Object)
   Local t:TTestType = TTestType(data)
   If t Then
      Print t.GetText()
   EndIf

   t.SetText("Daten wurden verändert")

   Return t

EndFunction


Local data:TTestType = TTestType.Create("Ich bin nur ein Test!")
Local thread:TThread=CreateThread( ThreadFunction, data)
Local result:TTestType = TTestType(WaitThread(thread))

Print result.GetText()



Die Methode GetText() ist harmlos, die Methode SetText() müsste natürlich gegen gleichzeitigen Zugriff absichern.

Der Eisvogel

BeitragMo, Jun 07, 2010 8:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Mh, das ist noch nicht ganz wie ich das meinte. Ich brauche die Variable in meinem eigentlich Thread überhaupt nicht, ich brauche diese nur in der Funktion. Die Variablen, die an der Thread gegeben werden, sind leidre nicht mehr in den Funktionen im Hauptcode enthalten. Folgender Code sollte die Problematik nochmals erklären:
BlitzMax: [AUSKLAPPEN]
Local t1:TThread=CreateThread(Test1,Null)
Local t2:TThread=CreateThread(Test2,Null)
Local t3:TThread=CreateThread(Test3,Null)

Input("")
End

Function Test1:Object(data:Object)
Global meineVariable:Int=1

Print "Ich bin Thread [Test1]"
Print TolleFunktion(1,2)
Print
End Function

Function Test2:Object(data:Object)
Global meineVariable:Int=2

Print "Ich bin Thread [Test2]"
Print TolleFunktion(1,2)
Print
End Function

Function Test3:Object(data:Object)
Global meineVariable:Int=3

Print "Ich bin Thread [Test3]"
Print TolleFunktion(1,2)
Print
End Function



Function TolleFunktion:String(param1,param2)
Print "In 'meineVariable' steht: "+meineVariable
End Function


Bei diesem Code wird 3 mal ausgegeben: In 'meineVariable' steht: 0
Was ja bedeutet, dass die Variable die im Thread deklaiert wurde, nicht mehr in der Funktion vorhanden ist. Wie bekomme ich jetzt 'meineVariable' in die Funktion?

Oder habe ich diene Beispiel nicht richtig verstanden?
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Silver_Knee

BeitragMo, Jun 07, 2010 8:50
Antworten mit Zitat
Benutzer-Profile anzeigen
jetzt erklär nochmal warum du sie nicht übergibst o.O

TolleFunktion(1,2,meinevariable)?

Der Eisvogel

BeitragMo, Jun 07, 2010 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil das bei mehreren Variablen ziemlich umständlich wird. Mach das mal mit 10-15 Variablen und du wirst merken, dass das nicht Optimal ist. Wink
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BtbN

BeitragMo, Jun 07, 2010 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau dafür ist TThreadData da. Das ist quasi eine variable, die in jedem thread einen anderen/eigenen Wert hat.

Der Eisvogel

BeitragMo, Jun 07, 2010 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, aber wie genau benutzte ich das? Ich werde da aus der Doku leider nicht schlau.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Der Eisvogel

BeitragDo, Jun 17, 2010 13:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, Sorry für Doppelpost, aber ich habe erneut ein Problem.
Ich habe inzwischen verstanden wie das mit der ThreadData funktioniert. Das ist echt genial, allerdings ist die Doku da recht fad geraten.

Also:
Am Anfang erstelle ich meine ThreadData. Ich habe eine Type, den ich dann als ThreadData verwenden. Diesen setze ich dort so rein:
BlitzMax: [AUSKLAPPEN]
SetThreadDataValue(td, New meinetype)

Aber nach einer Weile ist diese ThreadData dann einfach Null und ich weis nicht wieso. Der GC räumt ja auf, aber eigentlich sollte er doch nur Sachen freigeben, auf die keine Handle mehr existierit oder? Erkennt er dieses Handle nicht? Wenn ich vorher jeden Type in einer Variable speicher, dann gehts, aber dann muss ich das halt immer machen. Ist das normal?

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BtbN

BeitragDo, Jun 17, 2010 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Der inhalt von TThreadData wird ausserhalb von BMax gespeichert, im zugehörigen OS-Primitiv. Von daher musst du irgendwo das ding halten, damit der GC es nicht freiräumt.

Der Eisvogel

BeitragDo, Jun 17, 2010 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok Danke
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group