Variablen an Thread anhängen
Übersicht

![]() |
Der EisvogelBetreff: Variablen an Thread anhängen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Les dir mal die doku zu TThreadData durch. | ||
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
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() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
jetzt erklär nochmal warum du sie nicht übergibst o.O
TolleFunktion(1,2,meinevariable)? |
||
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Genau dafür ist TThreadData da. Das ist quasi eine variable, die in jedem thread einen anderen/eigenen Wert hat. | ||
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group