Vb.Net String für multithreading?

11/22/2011 14:39 Jopsi332#1
Hey, ich habe einen socket server mit multithreading und setze nach Class ein paar sachen wie z.b.
Dim paketcommand2 as string = vbnullstring

ich greife mit einem multithreading thread darauf zu und dann kommt immer
Code:
Das ActiveX-Steuerelement 248dd896-bb45-11cf-9abc-0080c7e7b78d kann nicht instanziiert werden, da der aktuelle Thread kein Singlethread-Apartment ist.
wie kann ich das ändern ohne es in jede Sub reinzuschreiben? da ich dort auch sachen gesetzt habe die von mehreren subs zugegriffen werden
11/22/2011 15:46 .exTremez™#2
wenn meine antwort falsch ist bitte nicht böse sein ^^
Weiss nicht ganz was du möchtest, aber:

Evt. deklarierst du die variable einfach schon von anfang an global?
11/22/2011 15:53 Jopsi332#3
Public Class main
Public paketcommand2 as string = vbnullstring
und dann die subs
ich will es auch so lassen theoretisch da ich nicht in jede sub das ändern will da es veradmmt viele sind :D
11/22/2011 16:20 Kraizy​#4
Wie greifst du denn auf die Klasse und Variable zu? Kannst du mal ein bisschen mehr davon rauskopieren oder ein kleines Beispiel posten?
11/22/2011 16:25 Jopsi332#5
Code:
    Private Sub Connectionlisten()
        While True
            client = server.AcceptTcpClient

            Dim c As New Connection 
            c.stream = client.GetStream
            c.streamr = New StreamReader(c.stream)
            c.streamw = New StreamWriter(c.stream)
            Dim data As Object = ""
            Data = c.streamr.ReadLine
            data = StringToHex(data)
            Dim Paket As String = vbNullString
            Dim PaketBoolean As Boolean = True
            While (PaketBoolean)
                Paket = ClientPaketBearbeitung(data)
                data = Replace(data, Paket, "")
                If (Len(data) = 0) Then
                    PaketBoolean = False
                End If
                 '/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\'
            'Reading client info'
            Dim readnames As New Read("Client", Paket)
            Dim Charname2 As String = vbNullString
            Dim charname3 As String = vbNullString
            Dim accname As String = vbNullString
            Dim PaketCommand2 As String = vbNullString
            readnames.ReadByte()
            readnames.ReadInt()
            readnames.ReadInt()
            readnames.ReadInt()
            readnames.ReadInt() '28-34'
            PaketCommand2 = readnames.ReadInt()
            If (PaketCommand2 = "00FF0000") Then
                readnames.ReadInt()
                readnames.ReadInt()
                readnames.ReadInt()
                readnames.ReadInt()
                readnames.ReadInt()
                readnames.ReadInt()
                Charname2 = readnames.ReadString
                accname = readnames.ReadString
                charname3 = readnames.ReadString
                ClientListBoxAdd("Info", "IP: " & ClientToServerWorld.RemoteHostIP & " Account: " & HexToString(charname3) & " Char: " & HexToString(accname))



            End If
            'End Reading client info'
            '/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\'

                Console.WriteLine("Account: " & c.acc & "Character: " & c.nick)
            End While
            list.Add(c) 

          

            Dim t As New Threading.Thread(AddressOf ListenToConnection)
            t.Start(c)
        End While
    End Sub
11/22/2011 16:30 Kraizy​#6
Also die ganzen anderen Sachen kannste ruhig weglassen, so hat doch niemand Lust sich alles durchzulesen. Wo genau kommt denn der Fehler? Das ganz unten Dim t As New...?
11/22/2011 16:32 Jopsi332#7
Nein mit der sub greife ich nur auf paketcommand2 = vbnullstring drauf zu der fehler kommt hier
Public Class main
Dim paketcommand2 as string = vbnullstring <-
11/22/2011 20:10 warfley#8
Ein string ist kein Active X Steuerelement, und daher hast du deinen fehler falsch lokalisiert

Tritt der fehler direkt beim start auf oder erst im laufe des programms?
wenn 2teres mit debuggen versucht?
benutzt du active x steuerelemente?
btw: Dim readnames As New Read("Client", Paket) kenne ich gar nicht
11/22/2011 20:12 Kraizy​#9
Quote:
Originally Posted by warfley View Post
btw: Dim readnames As New Read("Client", Paket) kenne ich gar nicht
Wahrscheinlich eigene Klasse?
11/22/2011 20:18 Jopsi332#10
es hat vor multithreading mit winsock funktioniert so habe nur auf socket mit multithreading umgestellt.

Quote:
Originally Posted by xKraizy View Post
Wahrscheinlich eigene Klasse?
jap habe mir dort sachen für paket analysing programmiert und angelegt
11/22/2011 21:29 warfley#11
Quote:
jap habe mir dort sachen für paket analysing programmiert und angelegt
finde ich iritierend, denn read ist ein schlüsselwort in vielen sprachen, und auch soweit ich weiß in alten VB versionen, außerdem ist das auch nicht ganz norm konform.

Also nochmal zu deiner fehlermeldung:
Du hast eine Active X Komponente, die multithreading, zumindest so wie du es anwendest, nicht unterstützt. Daher tippe ich darauf, das es sich dabei um die Winsocks handelt.

Also verwende doch besser die .Net Socket klassen, anstatt den winsocks
11/22/2011 21:53 Jopsi332#12
ich benutzte ja die socket klasse da ich winsocks jetz aus meinem source rausschmeioßen will.

SO
hab jetz mal alles was die connection braucht in jede sub definiert und nun kommt das
Public Version As String = "1.2"
Code:
Das ActiveX-Steuerelement 248dd896-bb45-11cf-9abc-0080c7e7b78d kann nicht instanziiert werden, da der aktuelle Thread kein Singlethread-Apartment ist
obowhl die connection garnicht auf version zugreift
11/23/2011 16:40 Kraizy​#13
Kannst du mal das Projekt (oder ein Stück davon) hochladen?
11/24/2011 19:36 Jopsi332#14
ich has nun rausgefunden. es liegt daran das ich eine cmd und eine form zusammen benutze und den code in der form habe und diese nicht für multithreading geht.