Announcement

Collapse
No announcement yet.

Problem mit der NetworkStream Klasse

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit der NetworkStream Klasse

    Hallo,

    also ich erstelle in meiner Applikation ein Thread und starte diesen. Die Aufgabe des Threads ist es darauf zu warten das ein Client kontakt über TCP/IP aufnimmt. Hierzu verwende ich :

    Code:
    Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient()
    Dim networkStream As NetworkStream = tcpClient.GetStream()
    Sendet der Client Daten so sollen diese ausgewertet werden und es sollen daraufhin bestimme daten zurückgesendet werden. Daten direkt in der Funktion des Threads zuversenden ist mit
    Code:
    networkStream.Write(sendBytes, 0, sendBytes.Length)
    dann auch kein Problem. Problematisch wirds aber wenn ich im Thread eine andere Funktion aufrufen möchte die das senden für micht übernimmt.

    Damit ich auch in dem anderen Modul in dem sich die Senden() Funktion befindet auf die Variable networkStream zugreifen kann, habe ich diese im Modul der Funktion die im Thread läuft als public und vom Typ Object deklariert.

    Führe ich das ganze aus bekomme ich die Fehlermeldung:
    Die Objektvariable oder die With-Blockvariable wurde nicht festgelegt - Mit Verweis auf die networkStream Zeile.

    Diese Fehlermeldung sagt mir aber leider nicht sehr viel.
    Wäre nett wenn mir jemand bei dem kleinen Problem helfen würde.


    Gruss

  • #2
    Hallo phpdev,

    ich seh dein Problem ganz wo anders, du versuchst von außen auf einen laufenden Thread zu zugreifen und versuchst von einem laufenden Thread auf eine Funktion / Element zu zu greifen, was außerhalb des Threads liegt. Leider ist das so nicht möglich.

    Es ist eigentlich nicht so gedacht das man die Thread`s so wie gerade beschrieben benutzt, es gibt allerdings eine Lösung dafür.

    Diese ist die "Invoke" Methode, diese arbeitet Threadübergreifend und kann somit auch auf außerhalb liegende Objekte zugreifen.

    Ein kleines Codebeispiel:

    Code:
    ' UpdateMethod() enthält den Code, der ein Windows-Steuerelement modifiziert.
    Dim UpdateDelegate As New MethodInvoker(AddressOf UpdateMethod)
    
    ' UpdateMethod() wird nun auf dem Benutzeroberflächen-Thread aufgerufen.
    ControlToUpdate.Invoke(UpdateDelegate)
    Wenn du weitere Informationen brauchst schau einfach hier

    Gruß Dirk

    Comment


    • #3
      Habe mich jetzt mit dem delegieren beschäftigt.
      Leider hab ich immer noch das Problem das ich auch eine eigene Funktion in einer Form nicht aufrufen kann.

      Ich hab also im Form eine Funktion die die neusten Daten aus einer Datenbank aussliest und in ein ListView schreibt. Jetzt wollte ich diese Funktion aus einem Thread aufrufen und habe dafür einen Delegater im Thread angelegt:

      Code:
      dim d1 As New mainlistview(AddressOf Main.AktualisiereListView)
      d1.invoke() ' ausführen
      Das erste Problem ist das ich in der Funktion AktualisiereListView() auf eine Methode aus einer Klasse zugreife, die in Main_Load() instanziiert wird.

      Steht derzeit auf dem Schlauch und weiss nicht wie ich das Problem lösen kann

      Bitte um Rat...

      Comment


      • #4
        Hab das jetzt einfach mit nem Timer gelöst.
        Trotzdem kann ich aus Threads noch nicht auf Controls zugreifen.

        Die muss ich aber z.b da ich einen Listener laufen habe und wenn ein Client dem Listener einen String schickt, soll dieser String in einer Textbox ausgegeben werden.

        Comment


        • #5
          Hallo phpdev,

          ich habe dir ein Stückchen Code geschrieben, hiermit kannst du auf eine "Textbox" außerhalb des Threads (also auf der Form) zugreifen.

          Code:
              Private m_strText As String
          
              Private Sub myThread()
                  ' Der Thread
                  m_strText = "Hier steht der empfangene Text"
                  MyControl.Invoke(New MethodInvoker(AddressOf SetText))
              End Sub
          
              Private Sub SetText()
                  ' Setzt den Text in die Textbox
                  MyControl.Text = m_strText
              End Sub
          Hoffe es hilft dir weiter.

          Dirk

          Comment

          Working...
          X