Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Как лучше передавать текст из потока?


Автор: transparent 10.7.2011, 23:10
ребят, ну неужели не кто не в курсе...
Что лучше
при чтении сразу посылать в процедуру инвока
Код:
readed = cs.Read(buff, 0, buff.Length)
 UDelegate(System.Text.Encoding.Default.GetString(buff, 0, readed))

или еще раз инвокать элемент

Код:
readed = cs.Read(buff, 0, buff.Length)
 TextBox2.Invoke(New txtUpdateDelegat(AddressOf UDelegate), System.Text.Encoding.Default.GetString(buff, 0, readed))

....
Напомню что чтение идет в цикле do..loop


а вот сама процедура инвока

Код:
Private Delegate Sub txtUpdateDelegat(ByVal txtText As String)
    Private Sub UDelegate(ByVal txtText As String)
        If Not TextBox2.InvokeRequired Then
            TextBox2.AppendText(txtText & ControlChars.CrLf)
        Else
            Dim UD As System.Delegate = New txtUpdateDelegat(AddressOf UDelegate)
            TextBox2.BeginInvoke(UD, New String() {txtText})
        End If
    End Sub 

Автор: diadiavova 11.7.2011, 12:54
Цитата(transparent @  11.7.2011,  00:10 Найти цитируемый пост)
ребят, ну неужели не кто не в курсе...

Такое ощущение, что это не топикстарт, а давно обсуждающаяся тема. 


M
diadiavova
Оформляй пост таким образом, чтобы можно было понять суть вопроса. И не забывай помечать код соответствующими тегами. Не в первый раз ведь на форуме

Автор: transparent 11.7.2011, 14:13
читаю присланный текст 

Код

Do While c.Connected
            Do While cs.DataAvailable
                readed = cs.Read(buff, 0, buff.Length)
            Loop


и вот не знаю каким лучше способом отправлять в процедуру передачи в основной поток
так: 

Код

Do While c.Connected
            Do While cs.DataAvailable
                readed = cs.Read(buff, 0, buff.Length)
 TextBox2.Invoke(New txtUpdateDelegat(AddressOf UDelegate), System.Text.Encoding.Default.GetString(buff, 0, readed))
            Loop


или так: 
Код

Do While c.Connected
            Do While cs.DataAvailable
                readed = cs.Read(buff, 0, buff.Length)
 UDelegate(System.Text.Encoding.Default.GetString(buff, 0, readed))
            Loop


а вот сама процедура обработки текста через инвок

Код

Private Delegate Sub txtUpdateDelegat(ByVal txtText As String)

    Private Sub UDelegate(ByVal txtText As String)
        If Not TextBox2.InvokeRequired Then
            TextBox2.AppendText(txtText & ControlChars.CrLf)
        Else
            Dim UD As System.Delegate = New txtUpdateDelegat(AddressOf UDelegate)
            TextBox2.BeginInvoke(UD, New String() {txtText})
        End If
        'Me.Activate()
    End Sub 

Автор: transparent 11.7.2011, 19:57
вот полный код того примера...я его уже дополнил..но тут привожу именно пример(немой), и вот с этим кодом я и работаю, а то есть пытаюсь понять как лучше инвокать текст, дабы не было ошибки не своего потока...Все операции в потоках

Код

Код:
Dim s As TcpListener

Sub AnySub() 'Запускает сервера
    s = New TcpListener("localhost", 1000)
   s.Start()
   Dim t As New Thread(Listening)
   t.Start()
End Sub

Sub Listening()
   Do
      Dim t As New Thread(AcceptClient)
      t.Start(s.AcceptTcpClient())
   Loop
End Sub

Sub AcceptClient(client As Object)
   Dim c As TcpClient = CType(client, TcpClient)
   Dim cs As NetworkStream = c.GetStream()
   Dim readed As Integer = 0
   Dim buff(1023) As Byte
   
   Do While c.Connected
      Do While cs.DataAvailable
         readed = cs.Read(buff, 0, buff.Length)
         Dim ClientRequest As String = System.Text.Encoding.ASCII.GetString(buff, 0, readed) 'Запрос
         'Обработка клиентского запроса...
         Dim ServerResponse() As Byte = System.Text.Encoding.ASCII.GetBytes("<Server response string>") 'Ответ
         cs.Write(ServerResponse, 0, ServerResponse.Length)
      Loop
      Thread.Sleep(15)
   Loop
   cs.Close()
   cs.Dispose()
   c.Close()
End Sub

Клиент:
Код:
Dim c As TcpClient
Dim cs As NetworkStream

Sub AnySub 'Подготавливает клиента к общению с сервером
      c = New TcpClient("localhost", 1000)
      cs = c.GetStream()
      Dim t As New Thread(RecieveAnswer)
      t.Start()
End Sub

Sub RecieveAnswer()
   Dim readed As Integer = 0
   Dim buff(1023) As Byte
   Do While c.Connected
      Do While cs.DataAvailable
         readed = cs.Read(buff, 0, buff.Length)
         MsgBox(System.Text.Encoding.ASCII.GetString(buff, 0, readed))
      Loop
      Thread.Sleep(15);
   Loop
End Sub

Sub SendRequest 'Отправляет запрос серверу
   If c IsNot Nothing And c.Connected Then
      Dim buff() As Byte = Encoding.ASCII.GetBytes("<Request string>")
      cs.Write(buff, 0, buff.Length)
   Else
      'Подключение отсутствует
   End If
End Sub

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)