TCP Client Abfrage bringt Form zum laggen

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von vb-opo-orbita.

    TCP Client Abfrage bringt Form zum laggen

    Hallo,

    ich stelle per TCP Client eine Verbindung zum Server her. Welchen Server, und für was für einen Zweck ist denke ich unwichtig.
    Also, ich muss damit rechnen das mich jede Millisekunde ein wichtiges Packet vom Server erreichen könnte, worauf ich reagieren muss. Ich habe es bisher so gelöst, das ich nen Timer hab, der auf Intervall 1 eingestellt ist, und die jeweilige Sub des TCP Moduls aufruft. Hier einmal der Code des Moduls:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.Net
    3. Imports System.IO
    4. Module client
    5. 'Einige Definationen hier
    6. Public mIP as String
    7. Dim Client As System.Net.Sockets.TcpClient
    8. Dim stream As NetworkStream
    9. Dim streamr As StreamReader
    10. Dim streamw As StreamWriter
    11. Dim Port As Integer = 8080
    12. Function client_recieve() As String
    13. Try
    14. client_recieve = streamr.ReadLine
    15. Catch
    16. End Try
    17. End Function
    18. Sub client_send(ByVal text As String)
    19. Try
    20. streamw.WriteLine(text)
    21. streamw.Flush()
    22. Catch
    23. End Try
    24. End Sub
    25. Sub connect()
    26. Try
    27. writelog("Connecting")
    28. Client = New System.Net.Sockets.TcpClient
    29. Client.Connect(mIP, Port)
    30. If Client.Connected Then
    31. stream = Client.GetStream
    32. streamw = New StreamWriter(stream)
    33. streamr = New StreamReader(stream)
    34. login()
    35. End If
    36. Catch ex As Exception
    37. writelog("Error Client 1: " & ex.Message)
    38. End Try
    39. End Sub
    40. Sub login()
    41. Try
    42. client_send("MEIN LOGIN PACKET HIER")
    43. Form1.tmr_account1.Enabled = True
    44. writelog("Connected " & Form1.name1 & " to map")
    45. Catch ex As Exception
    46. writelog("Cannot connect " & Form1.Name & " to map")
    47. End Try
    48. End Sub
    49. Sub writelog(ByVal text As String)
    50. Form1.event_log.Items.Add(text)
    51. Form1.event_log.SelectedIndex = Form1.event_log.Items.Count - 1
    52. End Sub
    53. Sub getinfo()
    54. Try
    55. Dim packet As String
    56. packet = ""
    57. packet = client_recieve()
    58. Dim split1() As String = packet.Split("|")
    59. If split1(0) = "0" Then
    60. If split1(1) = "KIK" Then
    61. writelog("Lost connection")
    62. Form1.tmr_account1.Enabled = False
    63. Exit Sub
    64. End If
    65. End If
    66. If split1(0) = "0" Then
    67. If split1(1) = "A" Then
    68. If split1(2) = "v" Then
    69. client_send("LAB|UPD|GET")
    70. End If
    71. End If
    72. End If
    73. If split1(1) = "LAB" Then
    74. If split1(2) = "UPD" Then
    75. client_send("RDY|MAP")
    76. End If
    77. End If
    78. 'Und noch viele weitere
    79. Catch
    80. End Try
    81. End Sub
    82. End Module


    So, und so wirds ganze letzendlich ausgeführt:

    VB.NET-Quellcode

    1. '....
    2. client.mIP = ip1
    3. client.connect()
    4. '...
    5. Private Sub tmr_account1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmr_account1.Tick
    6. client.getinfo()
    7. End Sub



    Der Timer bringt das ganze zum laggen. Das ist mir klar. Ich weiß dass ich es mit nem Thread lösen soltle (am besten oder?), nur kenne ich mich damit nicht so wirklich aus, habe es versucht indem ich im Modul anstatt den Timer einzuschalten das gemacht habe:

    VB.NET-Quellcode

    1. Dim abfrage as new Thread(AdressOf getinfo)
    2. abfrage.start

    Nur hat das nicht funktioniert, weil getinfo in einem eigenen thread lief und nichtmehr auf die Funktion WriteLog zugreifen kann, und auch die Packets nicht erhalten konnte.

    Ich hab auch schon gegoogelt, hat mir nichts gebracht :(

    Könntet Ihr mir irgendwie helfen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vb-opo-orbita“ ()

    Du darfst über einen neuen Thread keinesfalls auf deinen Haupt Thread zugreifen, in dem falle die Form.
    Schau am besten nach ob dein Thread auf einen Sub zugreift welcher Funktionen beinhaltet die auf die Form zugreifen.

    [VB 2010] Form steckt - Threads???

    LG.L

    vb-opo-orbita schrieb:

    Der Timer bringt das ganze zum laggen. Das ist mir klar. Ich weiß dass ich es mit nem Thread lösen soltle (am besten oder?), nur kenne ich mich damit nicht so wirklich aus,

    Du hast Recht: Du pollst (=ständiges Abfragen) per Timer auf dem GUI Thread, und das noch im Abstand von 1ms - wann sollen denn dann noch andere GUI-Ereignisse wie Ziehen/Klicken/Update erfolgen ?

    Schau Dir einmal den Post [VB.NET] Multiserver (TCP), ich denke Du findest dort schnell was Du brauchst.

    vb-opo-orbita schrieb:

    Nur hat das nicht funktioniert, weil getinfo in einem eigenen thread lief und nichtmehr auf die Funktion WriteLog zugreifen kann

    Per Invoke Dein Log schreiben ( analog wie beim o.g. Thread das Schreiben auf die Listview), bzw sobald Du etwas Zeit hast Dir eine threadfähige Log-Routine schreiben.

    Geht immer noch nicht

    Also, ich habe es jetzt so versucht, indem ichdas connecten zum server etc in eine sub getan hab, und diese als Thread ausführen lasse, doch verbindet er sich jetzt nichtmal mit dem server gescweigedenn sendet etwas (habe das ganze mit nem packet sniffer mitgesnifft).

    Hier nochmal der aktuelle Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Net.Sockets
    2. Imports System.Net
    3. Imports System.IO
    4. Imports System.Threading
    5. Module client1
    6. 'Einige Definiationen hier
    7. Public t As New Thread(AddressOf getinfo)
    8. Dim Client As System.Net.Sockets.TcpClient
    9. Dim stream As NetworkStream
    10. Dim streamr As StreamReader
    11. Dim streamw As StreamWriter
    12. Dim Port As Integer = 8080
    13. Dim logged As Boolean = False
    14. Dim ax, ay As Integer
    15. Function client_recieve() As String
    16. Try
    17. client_recieve= streamr.ReadLine
    18. Catch
    19. End Try
    20. End Function
    21. Sub client_send(ByVal text As String)
    22. Try
    23. streamw.WriteLine(text)
    24. streamw.Flush()
    25. Catch
    26. End Try
    27. End Sub
    28. Sub getinfo()
    29. Try
    30. If Client.Connected = False Then
    31. logged = False
    32. Client = New System.Net.Sockets.TcpClient
    33. Client.Connect(mIP, Port)
    34. If Client.Connected Then
    35. stream = Client.GetStream
    36. streamw = New StreamWriter(stream)
    37. streamr = New StreamReader(stream)
    38. Exit Sub
    39. End If
    40. End If
    41. Catch ex As Exception
    42. MsgBox(ex.Message)
    43. End Try
    44. If logged = False Then
    45. Try
    46. logged = True
    47. client_send("LOGIN PACKET HIER (Greift auf die Definationen oben zu!!!")
    48. client_send("PNG")
    49. Exit Sub
    50. Catch ex As Exception
    51. MsgBox(ex.Message)
    52. End Try
    53. End If
    54. Try
    55. Dim packet As String
    56. packet = ""
    57. packet = client_recieve()
    58. Dim split1() As String = packet.Split("|")
    59. If split1(0) = "0" Then
    60. If split1(1) = "KIK" Then
    61. Exit Sub
    62. End If
    63. End If
    64. If split1(0) = "0" Then
    65. If split1(1) = "A" Then
    66. If split1(2) = "v" Then
    67. client_send("LAB|UPD|GET")
    68. End If
    69. End If
    70. End If
    71. If split1(1) = "LAB" Then
    72. If split1(2) = "UPD" Then
    73. client_send("RDY|MAP")
    74. End If
    75. End If
    76. 'Und einige weiter ;)
    77. Catch ex As Exception
    78. MsgBox(ex.Message)
    79. End Try
    80. End Sub
    81. End Module



    Gestartet wird in der From1 so:

    VB.NET-Quellcode

    1. 'Zuweisungen an Client1
    2. client1.t.Priority = ThreadPriority.Highest
    3. client1.t.Start()