[VB.net] global var reactiveren na close

Pagina: 1
Acties:

  • Vampier
  • Registratie: Februari 2001
  • Laatst online: 20-04-2015

Vampier

poke-1,170

Topicstarter
Ik bne bezig om een remote control programma te maken voor een emulator project. Dit project werkt met TCP/IP communicate.

Ik gebruik visual basic.net

Ik gebruik deze class:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
Imports System.Net.Sockets
Imports System.Text
Imports System.IO

Public Class Connect
    Private strDomain As [String]
    Private arrDomain As [Byte]()
    Private tcpc As New TcpClient()
    Private result As String
    Private command As String

    Private m_ConnectionPort As Integer
    Private m_ConnectionIp As String
    Private m_Command As String

    Public Property Port()
        Get
            Return m_ConnectionPort
        End Get
        Set(ByVal value)
            m_ConnectionPort = value
        End Set
    End Property

    Public Property ip()
        Get
            Return m_ConnectionIp
        End Get
        Set(ByVal value)
            m_ConnectionIp = value
        End Set
    End Property

    Public Property connect()
        Get
            tcpc.Connect(m_ConnectionIp, m_ConnectionPort)
            strDomain = "<openmsx-control>"
            arrDomain = Encoding.ASCII.GetBytes(strDomain.ToCharArray())

            Dim s As Stream = tcpc.GetStream()
            s.Write(arrDomain, 0, strDomain.Length)
            Dim sr As New StreamReader(tcpc.GetStream(), Encoding.ASCII)
            While -1 <> sr.Peek()
                result = sr.ReadLine()
            End While
            Return result
        End Get
        Set(ByVal value)
            '
        End Set
    End Property

    Public Property execute(ByVal command As String)
        Get

            Try
                strDomain = "<command>" & command & "</command>" + Chr(13)
                arrDomain = Encoding.ASCII.GetBytes(strDomain.ToCharArray())
                Dim s As Stream = tcpc.GetStream()
                s = tcpc.GetStream()
                s.Write(arrDomain, 0, strDomain.Length)
                Dim sr2 As New StreamReader(tcpc.GetStream(), Encoding.ASCII)
                While -1 <> sr2.Peek()
                    result = sr2.ReadLine()
                End While
            Catch e As Exception
                Debug.Write("Exception: " & e.Message)
                Return "Error::" & e.Message
            End Try
            Return result
        End Get
        Set(ByVal value)
            'command = m_Command
        End Set
    End Property

    Public Property close()
        Get
            tcpc.Close()
            Return "done"
        End Get
        Set(ByVal value)
            tcpc.Close()
        End Set
    End Property

End Class


In mijn main form zet ik als volgt de connectie op

Eerst doe ik een global 'dim connect as new connect()'

code:
1
2
3
4
5
        Dim connection As New Connect()
        connection.Port = 9962
        connection.ip = "127.0.0.1"
        Dim bla = connection.connect()
        bla = connection.execute("set scaler hq2xlite")


als ik echter mijn class sluit met connection.close() dan wordt de verbinding verbroken en het object (connection) getermineerd. (ik wil namelijk naar meer dan 1 IP connecten of naar een andere poort)

Echter bij een reconnect krijg ik een

code:
1
Cannot access a disposed object.Object name: 'System.Net.Sockets.TcpClient'.


Hoe kan ik mijn object reactiveren? (of hergebruiken)

[ Voor 4% gewijzigd door Vampier op 27-11-2005 22:02 ]


  • Vampier
  • Registratie: Februari 2001
  • Laatst online: 20-04-2015

Vampier

poke-1,170

Topicstarter
de oplossing bleek simpel

code:
1
2
3
    Public Property connect()
        Get
            tcpc = New TcpClient()


Gewoon een niewe regel tcpc = New TcpClient() toevoegen.

Deze kan opslot... sorry voor de database vervuiling!!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-04 22:35

Creepy

Tactical Espionage Splatterer

Je tcpc is een TcpClient. Je instantieert deze niet op de juiste plek. Maak gewoon een constructor en een destructor voor je class waarin je je TcpClient kan instantieren (new) en kan sluiten (close). Als je dan een nieuwe connectie nodig hebt dan instantieer je gewoon een nieuwe Connect.

Waarom doe je overigens alles met properties? connect(), execute() en close() zijn echte methods en die wil je gewoon aan kunnen roepen. Een set en een get gaan daar helemaal niet voor op. Je hoeft dan dus ook niet die onnodige variabele bla te gebruiken.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-04 22:35

Creepy

Tactical Espionage Splatterer

Vampier schreef op zondag 27 november 2005 @ 22:59:
de oplossing bleek simpel

code:
1
2
3
    Public Property connect()
        Get
            tcpc = New TcpClient()


Gewoon een niewe regel tcpc = New TcpClient() toevoegen.

Deze kan opslot... sorry voor de database vervuiling!!
Of het opslot kan bepalen wij wel ;) En DB vervuiling is het niet want ik wil erg graag weten waarom je alles met properties doet waardoor je die variabele bla nodig hebt i.p.v. dat je normale methods gebruikt :P

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Vampier
  • Registratie: Februari 2001
  • Laatst online: 20-04-2015

Vampier

poke-1,170

Topicstarter
ik ben nog maar net met vb.net begonnen... ik heb altijd in de webscripting zooi gezeten. Sinds ik begonnen ben ik al 4x opnieuw begonnen omdat ik steeds weer nieuwe inzichten kreeg. Dus waarschijnlijk lach ik om deze vraag over 2 dagen ;)

(klein detail: dit is voor slingshot, een vb.net launcher voor openMSX ;))

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:33
:?
Ik vraag me net zoals Creepy af waarom jij alles met properties doet ?
En sinds wanneer hebben properties haakjes ? Ik durf trouwens wedden dat dit gewoon niet compileert als je compileert met de CLSCompliant attribute op true. Ik zie nl. een property die argumenten neemt.

En dan dit:
code:
1
2
3
4
5
6
7
8
9
Public Property close()
        Get
            tcpc.Close()
            Return "done"
        End Get
        Set(ByVal value)
            tcpc.Close()
        End Set
    End Property

Wat is het nut van die set ?

Gebruik gewoon methods en properties op de juiste plekken. Een property kan je gewoon beschouwen als een getter/setter. Echter, Close(), Connect(), etc.... moeten methods zijn.

https://fgheysels.github.io/


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-04 22:35

Creepy

Tactical Espionage Splatterer

Dat je voor openMSX bezig bent had ik al door ;) (/me loves openMSX :P ).

No offense natuurlijk, maar het lijkt erop dat je op een OO manier wilt werken terwijl je nog niet zo goed met OO bekend bent. Ik denk dat als je daar meer inzicht in hebt je ook snapt waarom wij afvragen waarom je properties gebruikt.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Vampier
  • Registratie: Februari 2001
  • Laatst online: 20-04-2015

Vampier

poke-1,170

Topicstarter
ik ben nog niet zo bekend met OOP inderdaad... ben eraan bezig ;)

  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 05-02 21:24
Vampier schreef op woensdag 07 december 2005 @ 06:27:
ik ben nog niet zo bekend met OOP inderdaad... ben eraan bezig ;)
ALs je er mee bezig bent is het juist goed om even bij die vragen stil te gaan staan en afvragen waarom je properties gebruikt, voordat je jezelf verkeerde dingen gaat aanleren.

Zie ook de volgende pagina waar het verschil tussen properties en methods wordt uitgelegd:
http://msdn.microsoft.com...nisitpropertyormethod.asp
Pagina: 1