Unable to convert from Object(Object) to Object(Object) (MT)

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

juse4pro

Betreff: Unable to convert from Object(Object) to Object(Object) (MT)

BeitragMi, Jul 21, 2010 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, ich habe mal angefangen mein Server zu programmieren... Jedoch gibts Probleme mit Multithreading im Zusammenhand mit Klassen... Hier mal mein Code:

BlitzMax: [AUSKLAPPEN]
SuperStrict

Framework Vertex.BNetEx

Import BRL.System
Import BRL.Blitz
Import BRL.Retro
Import BRL.Math
Import BRL.Random
Import BRL.LinkedList
Import BRL.PolledInput
Import BRL.Timer
Import BRL.Threads

'globale Variablen
Global gOutputList:TList = New TList
Global gPlayerList:TList = New TList
Global gThreadMutex:TMutex = CreateMutex()

'Klasse für die einzelnen Output-Einträge
Type tOutputEntry
Field fTime:String
Field fMsg:String
EndType

'abstrakte Basisklasse der Server-Threads
Type tServerThread
Field fName:String = "unknown Thread"
Field fThread:TThread
Field fFpsTimer:TTimer

Method Init() Abstract
Method ThreadWork:Object(fParameter:Object) Abstract

Method SaveCPU()
WaitTimer(Self.fFpsTimer)
EndMethod
EndType

'Master-Server-Thread (Informationen preisgeben, Kontrollieren der Threads)
Type tMasterServerThread Extends tServerThread
Field fServerPort:Short = 47374
Field fMaxPlayerCount:Short = 5
Field fPlayerCount:Short = 0
Field fRateExperience:Float = 1.0
Field fRateGoldDropRate:Float = 1.0
Field fPvPEnabled:Byte = True

Field fLoginServer:tLoginServerThread
Field fWorldServer:tWorldServerThread
Field fOutputThread:tOutputThread

Method Init()
Self.fName = "MASTER_SERVER_THREAD"
Self.fFpsTimer = CreateTimer(10)
Self.fThread = MainThread()

Self.fLoginServer = New tLoginServerThread
Self.fLoginServer.Init()
Self.fWorldServer = New tWorldServerThread
Self.fWorldServer.Init()
Self.fOutputThread = New tOutputThread
Self.fOutputThread.Init()

Self.ThreadWork()
EndMethod

Method ThreadWork:Object(fParameter:Object="")
While Not AppTerminate()
Self.SaveCPU()
Wend
EndMethod

Method ReadConfig()
Local lFileStream:TStream = ReadFile("database/config.cfg")
If lFileStream
CloseFile(lFileStream)
Else

EndIf
EndMethod
EndType

'Login-Server (Einloggen, Ausloggen, Registrieren, Spieler speichern, u.s.w.)
Type tLoginServerThread Extends tServerThread
Method Init()
Self.fName = "LOGIN_SERVER_THREAD"
Self.fThread = CreateThread(Self.ThreadWork, Null)
Self.fFpsTimer = CreateTimer(1)
EndMethod

Method ThreadWork:Object(fParameter:Object)
SaveCPU()
EndMethod
EndType

'World-Server (Rumlaufen, Kampf, LvLup, Quests, u.s.w.)
Type tWorldServerThread Extends tServerThread
Method Init()
Self.fName = "WORLD_SERVER_THREAD"
Self.fFpsTimer = CreateTimer(50)
Self.fThread = CreateThread(Self.ThreadWork, Null)
EndMethod

Method ThreadWork:Object(fParameter:Object)
Repeat
Self.SaveCPU()
Forever
EndMethod
EndType

'Thread zum Ausgeben von Informationen
Type tOutputThread Extends tServerThread
Method Init()
Self.fName = "OUTPUT_THREAD"
Self.fFpsTimer = CreateTimer(10)
Self.fThread = CreateThread(Self.ThreadWork, Null)
EndMethod

Method ThreadWork:Object(fParameter:Object)
Repeat
LockMutex(gThreadMutex)
If Len(gOutputList) > 0
Local lOutputEntry:tOutputEntry = gOutputList.First()
Print lOutputEntry.fTime+": "+lOutputEntry.fMsg
gOutputList.Remove(lOutputEntry)
EndIf
UnlockMutex(gThreadMutex)
Self.SaveCPU()
Forever
EndMethod
EndType


'globale Funktionen
'der Liste der Ausgabe einen Eintrag hinzufügen
Function Output(lMsg:String)
LockMutex(gThreadMutex)
Local lOutputEntry:TOutputEntry = New tOutputEntry
lOutputEntry.fTime = CurrentTime()
lOutputEntry.fMsg = lMsg
gOutputList.AddLast(lOutputEntry)
UnlockMutex(gThreadMutex)
EndFunction


Hoffe die Kommentare genügen...

EDIT: In der Zeile, wo der erste Thread erstellt wird, kommt die Fehklermeldung aus dem Titel
Portfolio |LinkedIn |XING

mpmxyz

BeitragMi, Jul 21, 2010 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
		Self.fThread = CreateThread(Self.ThreadWork, Null)

Hier ist der Fehler, nicht wahr?
Du gibst beim Parameter eine Methode an, wo eine Funktion erwartet wird.
Mache es anders:
Gebe eine Funktion an, die die entsprechende Methode aufruft. (Null wird dafür durch das Objekt ersetzt.)
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

juse4pro

BeitragMi, Jul 21, 2010 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann es sein, oder steh ich aufm Schlauch...

Aber ist eine Methode keine Funktion?

Aber ich werde trotzdem mal probieren, deine Idee zumzusetzten (Obwohl ich auf viele globale Funkionen verzichten wollte Wink )
Portfolio |LinkedIn |XING

mpmxyz

BeitragMi, Jul 21, 2010 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Methoden sind objektbezogen. (Man kann "Self" verwenden, es gibt Polymorphie etc.)
Funktionen sind von Objekten unabhängig.
Übrigens: Man kann Funktionen auch in Types deklarieren. So gibt es auch kein Problem mit "globalen Funktionen". Wink
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

juse4pro

BeitragMi, Jul 21, 2010 23:04
Antworten mit Zitat
Benutzer-Profile anzeigen
hää? Dann sind sie aber doch im globalen Namespace...

Ach ist ja auch egal...
Danke für den Hinweis... ^^

Ich werd mich gleich ransetzten

EDIT:
LOL, jetzt sagt er mir, er kennt TMutex nicht? WTF?
Das ist laut Dokumentation im BRL.Threads drin, oder?
Portfolio |LinkedIn |XING
 

klepto2

BeitragDo, Jul 22, 2010 18:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Build options auf threaded gesetzt?
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu

juse4pro

BeitragDo, Jul 22, 2010 22:23
Antworten mit Zitat
Benutzer-Profile anzeigen
omg... Ja das wars...

Aber... neues Problem...
BlitzMax: [AUSKLAPPEN]
SuperStrict

Framework Vertex.BNetEx

Import BRL.System
Import BRL.Blitz
Import BRL.Retro
Import BRL.Math
Import BRL.Random
Import BRL.LinkedList
Import BRL.PolledInput
Import BRL.Timer
Import BRL.Threads

'globale Variablen
Global gOutputList:TList = New TList
Global gPlayerList:TList = New TList
Global gThreadMutex:TMutex = CreateMutex()

'Klasse für die einzelnen Output-Einträge
Type tOutputEntry
Field fTime:String
Field fMsg:String
EndType

'abstrakte Basisklasse der Server-Threads
Type tServerThread
Field fName:String = "unknown Thread"
Field fThread:TThread
Field fFpsTimer:TTimer

Method Init() Abstract
Method ThreadWork() Abstract

Method SaveCPU()
WaitTimer(Self.fFpsTimer)
EndMethod

Function Thread:Object(lObject:Object)
Local lServerThread:tServerThread = tServerThread(lObject)
Output("Thread: '"+lServerThread.fName+"' started..")
lServerThread.ThreadWork()
EndFunction
EndType

'Master-Server-Thread (Informationen preisgeben, Kontrollieren der Threads)
Type tMasterServerThread Extends tServerThread
Field fServerPort:Short = 47374
Field fMaxPlayerCount:Short = 5
Field fPlayerCount:Short = 0
Field fRateExperience:Float = 1.0
Field fRateGoldDropRate:Float = 1.0
Field fPvPEnabled:Byte = True

Field fLoginServer:tLoginServerThread
Field fWorldServer:tWorldServerThread
Field fOutputThread:tOutputThread

Method Init()
Self.fName = "MASTER_SERVER_THREAD"
Self.fFpsTimer = CreateTimer(10)
Self.fThread = MainThread()

Output("Output thread is starting...")
Self.fOutputThread = New tOutputThread
Self.fOutputThread.Init()
Output("Login server is starting...")
Self.fLoginServer = New tLoginServerThread
Self.fLoginServer.Init()
Output("World server is starting...")
Self.fWorldServer = New tWorldServerThread
Self.fWorldServer.Init()

Self.ThreadWork()
EndMethod

Method ThreadWork()
Repeat
Self.SaveCPU()
Forever
EndMethod

Method ReadConfig()
Local lFileStream:TStream = ReadFile("database/config.cfg")
If lFileStream
CloseFile(lFileStream)
Else

EndIf
EndMethod
EndType

'Login-Server (Einloggen, Ausloggen, Registrieren, Spieler speichern, u.s.w.)
Type tLoginServerThread Extends tServerThread
Method Init()
Self.fName = "LOGIN_SERVER_THREAD"
Self.fThread = CreateThread(tServerThread.Thread, Self)
Self.fFpsTimer = CreateTimer(1)
EndMethod

Method ThreadWork()
Repeat
SaveCPU()
Forever
EndMethod
EndType

'World-Server (Rumlaufen, Kampf, LvLup, Quests, u.s.w.)
Type tWorldServerThread Extends tServerThread
Method Init()
Self.fName = "WORLD_SERVER_THREAD"
Self.fFpsTimer = CreateTimer(50)
Self.fThread = CreateThread(tServerThread.Thread, Self)
EndMethod

Method ThreadWork()
Repeat
Self.SaveCPU()
Forever
EndMethod
EndType

'Thread zum Ausgeben von Informationen
Type tOutputThread Extends tServerThread
Method Init()
Self.fName = "OUTPUT_THREAD"
Self.fFpsTimer = CreateTimer(10)
Self.fThread = CreateThread(tServerThread.Thread, Self)
EndMethod

Method ThreadWork()
Repeat
LockMutex(gThreadMutex)
If Len(gOutputList) > 0
Local lOutputEntry:tOutputEntry = Null
For Local lEntry:tOutputEntry = EachIn gOutputList
lOutputEntry = lEntry
Exit
Next
If lOutputEntry
Print lOutputEntry.fTime+": "+lOutputEntry.fMsg
gOutputList.Remove(lOutputEntry)
EndIf
EndIf
UnlockMutex(gThreadMutex)
Self.SaveCPU()
Forever
EndMethod
EndType


'globale Funktionen
'der Liste der Ausgabe einen Eintrag hinzufügen
Function Output(lMsg:String)
LockMutex(gThreadMutex)
Local lOutputEntry:TOutputEntry = New tOutputEntry
lOutputEntry.fTime = CurrentTime()
lOutputEntry.fMsg = lMsg
gOutputList.AddLast(lOutputEntry)
UnlockMutex(gThreadMutex)
EndFunction



'Teste... ... ...
Local lMaster:tMasterServerThread = New tMasterServerThread
lMaster.Init()


An dieser Stelle:
BlitzMax: [AUSKLAPPEN]
	Function Thread:Object(lObject:Object)
Local lServerThread:tServerThread = tServerThread(lObject)
Output("Thread: '"+lServerThread.fName+"' started..")
lServerThread.ThreadWork()
EndFunction



funktioniert das Umcasten nicht, und wenn ich die Funktion so schreibe:
BlitzMax: [AUSKLAPPEN]
	Function Thread:Object(lObject:tServerThread)
Local lServerThread:tServerThread = lObject
Output("Thread: '"+lServerThread.fName+"' started..")
lServerThread.ThreadWork()
EndFunction


Dann, sagt mir der Compiler, dass er ein OBJECT erwartet und kein tServerThread...

(Ich finds ein bissl inkompetent, ab er egal)

Welches Workarround gibts da?
Portfolio |LinkedIn |XING
 

TheGamePope

BeitragDi, Jul 27, 2010 19:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Also das er Object und nich tServerThread beim 2. Erwartet is klar. Aber beim ersten müsste eigentlich alles stimen. Was sagt der compiler denn genau?

juse4pro

BeitragMi, Jul 28, 2010 1:41
Antworten mit Zitat
Benutzer-Profile anzeigen
in der Zeile:
BlitzMax: [AUSKLAPPEN]
Local lServerThread:tServerThread = tServerThread(lObject)


Schafft er das umcasten nicht, und kann die Methoden von lServerThread nicht verwenden, da so ein "Tried to access a Null-Object" kommt
Portfolio |LinkedIn |XING

mpmxyz

BeitragMi, Jul 28, 2010 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Bist du sicher, dass dort ein Fehler liegt?
Bei mir funktioniert nämlich das umcasten wunderbar.
Du solltest aber die Timer vor den jeweiligen Threads erstellen lassen, da diese rein theoretisch immer darauf zugreifen könnten.
(Ich war eben am Code-Debuggen.)
So wie es aussieht, vertragen sich Timer überhaupt nicht mit Threads. (Mir fiel auf, dass immer nur eine Zeile ausgegeben wurde. -> Endlosschleife in Waittimer)
Schreibe dir einen eigenen Timer, der mit "Millisecs" und "Delay" arbeitet.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

TheGamePope

BeitragMi, Jul 28, 2010 14:39
Antworten mit Zitat
Benutzer-Profile anzeigen
juse4pro hat Folgendes geschrieben:
in der Zeile:
BlitzMax: [AUSKLAPPEN]
Local lServerThread:tServerThread = tServerThread(lObject)


Schafft er das umcasten nicht, und kann die Methoden von lServerThread nicht verwenden, da so ein "Tried to access a Null-Object" kommt


wenn er sagt, das er kein null objekt verwenden kann, dann würde das bedeuten, das die parameter nicht korrekt übergeben werden, sprich lObject = Null. Kann aber echt nich finden, wo da der fehler leigt. Überprüf als erstes mal die build options. Dann probiers mal ohne framework. Vlt. fehlt einfach eine datei oder so (wobei da der compiler eigentlich meckern müsste)

BladeRunner

Moderator

BeitragMi, Jul 28, 2010 14:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn er wegen eines Nullobjetkes Meckert ging das Casten ja, es wurde halt nur eine Null gecastet Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

TheGamePope

BeitragMi, Jul 28, 2010 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Jaja. AAAAAber... Ich hab da mal n kleines beispiel gemacht:
BlitzMax: [AUSKLAPPEN]
Type Test
Field msg$ = "Hallo"
End Type

t:test = New test
Print Cast(t)
Print Cast(Null)

Function Cast$(_obj:Object)
Return test(_obj).msg$
End Function


Das compilieren und linked funzt. Allerdings gibts nen assert beim ausführen. Schätze mal das folgender auch bei dir kommt:
"Unhandled Exception:Attempt to access field or method of Null object"

Das kommt bei null objekten. Da das auch bei ihm kommt, heißt das das der compiler self nicht an den thread übergeben kann (Da das ja das verwendete objekt für den thread is.
Kann aber auch daran liegen, dass du eine funktion eines typs übergibst und zwar tServerThread.Thread (Glaub ich)

juse4pro

BeitragDo, Jul 29, 2010 1:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie idiotisch...
Tja also irgendwie hat BlitzMax das nochnicht so mit Threads...

Ich werde mir eine Alternative suchen Wink

Aber Danke für die ganzen Tipp's...
Portfolio |LinkedIn |XING

mpmxyz

BeitragDo, Jul 29, 2010 11:26
Antworten mit Zitat
Benutzer-Profile anzeigen
@juse4pro
Was soll hier idiotisch sein?
Der Code läuft hier wunderbar, wenn man von dem Problem mit den Timern und einer fehlerhaft programmierten Längenabfrage mal absieht.
Welche BlitzMax-Version verwendest du? (Ich nutze gerade die Version 1.40 auf einem Windows Vista.)
Ich habe noch nie Probleme mit Threads an sich gehabt. (Okay, ein paar Module sollten irgendwann einmal threadübergreifend lauffähig sein, aber Threads an sich haben keine mir bekannten Probleme.)
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

juse4pro

BeitragFr, Jul 30, 2010 4:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein.. "idiotisch" bezieht sich auf die Eingeschränktheit, der CreateThread Funktion...

Und Ich finde es wortwortlich fabelhaft, dass der Code bei dir läufft, denn bei mir eben nicht, ich habe versucht, alles umzusetzten, was mir gesagt wurde...

Ich habe auch BlitzMax 1.40 auf Vista (32 Bit... auf einem 64 Bit Rechner [Fragt nicht wieso : / ])

Kannst su mal den "funktionierenden Code" posten, bitte? Very Happy

Juse
Portfolio |LinkedIn |XING

mpmxyz

BeitragFr, Jul 30, 2010 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
SuperStrict

Framework Vertex.BNetEx

Import BRL.System
Import BRL.Blitz
Import BRL.Retro
Import BRL.Math
Import BRL.Random
Import BRL.LinkedList
Import BRL.PolledInput
Import BRL.Timer
Import BRL.Threads

'globale Variablen
Global gOutputList:TList = New TList
Global gPlayerList:TList = New TList
Global gThreadMutex:TMutex = CreateMutex()

'Klasse für die einzelnen Output-Einträge
Type tOutputEntry
Field fTime:String
Field fMsg:String
EndType

'abstrakte Basisklasse der Server-Threads
Type tServerThread
Field fName:String = "unknown Thread"
Field fThread:TThread
Field fLastWait:Int=MilliSecs()
Field fIntervall:Int

Method Init() Abstract
Method ThreadWork() Abstract

Method SaveCPU()
Local curTime:Int=MilliSecs()
Local waittime:Int=fLastWait+fIntervall-curTime
If waittime>0
Delay waittime
EndIf
fLastWait=MilliSecs()
EndMethod

Function Thread:Object(lObject:Object)
Local lServerThread:tServerThread = tServerThread(lObject)
Output("Thread: '"+lServerThread.fName+"' started..")
lServerThread.ThreadWork()
EndFunction
EndType

'Master-Server-Thread (Informationen preisgeben, Kontrollieren der Threads)
Type tMasterServerThread Extends tServerThread
Field fServerPort:Short = 47374
Field fMaxPlayerCount:Short = 5
Field fPlayerCount:Short = 0
Field fRateExperience:Float = 1.0
Field fRateGoldDropRate:Float = 1.0
Field fPvPEnabled:Byte = True

Field fLoginServer:tLoginServerThread
Field fWorldServer:tWorldServerThread
Field fOutputThread:tOutputThread

Method Init()
Self.fName = "MASTER_SERVER_THREAD"
Self.fIntervall=100
Self.fThread = MainThread()

Output("Output thread is starting...")
Self.fOutputThread = New tOutputThread
Self.fOutputThread.Init()
Output("Login server is starting...")
Self.fLoginServer = New tLoginServerThread
Self.fLoginServer.Init()
Output("World server is starting...")
Self.fWorldServer = New tWorldServerThread
Self.fWorldServer.Init()

Self.ThreadWork()
EndMethod

Method ThreadWork()
Repeat
Self.SaveCPU()
Forever
EndMethod

Method ReadConfig()
Local lFileStream:TStream = ReadFile("database/config.cfg")
If lFileStream
CloseFile(lFileStream)
Else

EndIf
EndMethod
EndType

'Login-Server (Einloggen, Ausloggen, Registrieren, Spieler speichern, u.s.w.)
Type tLoginServerThread Extends tServerThread
Method Init()
Self.fName = "LOGIN_SERVER_THREAD"
Self.fThread = CreateThread(tServerThread.Thread, Self)
Self.fIntervall=1000
EndMethod

Method ThreadWork()
Repeat
SaveCPU()
Forever
EndMethod
EndType

'World-Server (Rumlaufen, Kampf, LvLup, Quests, u.s.w.)
Type tWorldServerThread Extends tServerThread
Method Init()
Self.fName = "WORLD_SERVER_THREAD"
Self.fIntervall=20
Self.fThread = CreateThread(tServerThread.Thread, Self)
EndMethod

Method ThreadWork()
Repeat
Self.SaveCPU()
Forever
EndMethod
EndType

'Thread zum Ausgeben von Informationen
Type tOutputThread Extends tServerThread
Method Init()
Self.fName = "OUTPUT_THREAD"
Self.fIntervall=100
Self.fThread = CreateThread(tServerThread.Thread, Self)
EndMethod

Method ThreadWork()
Repeat
LockMutex(gThreadMutex)
If Not gOutputList.isEmpty() '"Len" funktioniert nur mit Strings und Arrays!
Local lOutputEntry:tOutputEntry = Null
For Local lEntry:tOutputEntry = EachIn gOutputList
lOutputEntry = lEntry
Exit
Next
If lOutputEntry
Print lOutputEntry.fTime+": "+lOutputEntry.fMsg
gOutputList.Remove(lOutputEntry)
EndIf
EndIf
UnlockMutex(gThreadMutex)
Self.SaveCPU()
Forever
EndMethod
EndType


'globale Funktionen
'der Liste der Ausgabe einen Eintrag hinzufügen
Function Output(lMsg:String)
LockMutex(gThreadMutex)
Local lOutputEntry:TOutputEntry = New tOutputEntry
lOutputEntry.fTime = CurrentTime()
lOutputEntry.fMsg = lMsg
gOutputList.AddLast(lOutputEntry)
UnlockMutex(gThreadMutex)
EndFunction



'Teste... ... ...
Local lMaster:tMasterServerThread = New tMasterServerThread
lMaster.Init()

Hier ist er.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

juse4pro

BeitragFr, Jul 30, 2010 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahh... ok, also hast du nur die Timer umschrieben, okay.

Aber kann es bei Millisecs() nicht passieren, dass 2 Thread auf die globale Variable von Millisecs() zugreiffen, und alles abschmiert?
Portfolio |LinkedIn |XING

mpmxyz

BeitragFr, Jul 30, 2010 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Zwei Dinge:
1. Was für eine globale Variable meinst du? Ich sehe da keine dieser Art bei brl.Blitz.
2. Threads können gleichzeitig auf Daten zugreifen, solange sie alle nur Daten lesen.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

juse4pro

BeitragFr, Jul 30, 2010 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahh okay, erklärt einiges.

In der Modulbeschreibung steht "accessing..." und ich dachte damit meinen die schreiben und lesen, also eben zugreifen.

Und ok, ich dachte, dass die das mit einer globalen Variable machen, aber anscheiend nicht. Wink

EDIT:
Zufälliger MAV... Warum? Eigentlich sollte das nicht passieren, das ServerThread Objekt wird nach dem starten nicht mehr angerührt... (ausser vom Thread selber)
Portfolio |LinkedIn |XING

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group