Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Потоки :(( Добавлено: 17.09.08 23:57  

Автор вопроса:  NeKoder
Доброго времени суток!

Пишу программку для передачи сообщений по сети (в целях понять, как это вообще), приходится использовать потоки, чтобы сообщения могли присылать несколько пользователей одновременно. Нужно приходящее сообщение поместить в TextBox на форме, понимаю, что надо использовать invoke, но не понимаю как :(( Пожалуйста, помогите, раньше с потоками не связывался, а вот теперь "приспичило". P.S.: MSDN видимо не для меня :(

Осн.:
Public Class Form1

    Private ListenerThread As Threading.Thread
    Private Listener As Net.Sockets.TcpListener

    Private Sub start_button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles start_button.Click
        ListenerThread = New Threading.Thread(AddressOf DoListen)
        ListenerThread.Start()
    End Sub

    Private Sub DoListen()
        Try
            Listener = New Net.Sockets.TcpListener(Net.IPAddress.Any, port_box.Text)
            Listener.Start()
        Catch ex As Exception
            MsgBox("Не удалось запустить сервер")
        End Try

        Do While Not ListenerThread Is Nothing
            Try
                 Dim NewConnection As UserConnect = New UserConnect(Listener.AcceptTcpClient)
            Catch ex As Exception
                MsgBox("Поток закончил свою работу")
            End Try
        Loop

    End Sub
End Class


UserConnect:
Public Class UserConnect
    Dim func As func
    Private Client As Net.Sockets.TcpClient
    Private Writer As IO.StreamWriter
    Public Const BufferSize As Integer = 4096
    Private ReadBuffer(BufferSize) As Byte

    Public Sub New(ByVal ExistingClient As Net.Sockets.TcpClient)
        Me.Client = ExistingClient
        Me.Writer = New IO.StreamWriter(Client.GetStream)
        Me.Client.GetStream.BeginRead(ReadBuffer, 0, BufferSize, AddressOf ReceiverCallback, Nothing)
    End Sub

    Private Sub ReceiverCallback(ByVal ar As IAsyncResult)

        Dim BytesRead As Integer

        Try
            BytesRead = Client.GetStream.EndRead(ar)

            Dim strMessage As String = System.Text.Encoding.UTF8.GetString(ReadBuffer, 0, BytesRead)

            func.NewMsg(strMessage)

            Client.GetStream.BeginRead(ReadBuffer, 0, BufferSize, AddressOf ReceiverCallback, Nothing)

            Catch e As Exception

        End Try
    End Sub
End Class


func:

Public Class func
    Public Sub NewMsg(ByVal Data As String)
        Form1.TextBox1.Text = Data
    End Sub
End Class

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #1
Добавлено: 18.09.08 14:02
Юзай BackgroundWorker'ы и не парься!

Ответить

Номер ответа: 2
Автор ответа:
 NeKoder



Вопросов: 1
Ответов: 3
 Профиль | | #2 Добавлено: 18.09.08 14:26
А по подробнее можно?

Ответить

Номер ответа: 3
Автор ответа:
 __Pavel__



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #3
Добавлено: 18.09.08 15:31
понимаю, что надо использовать invoke, но не понимаю как :((

Надеюсь я вас правильно понял... вот пример использования Delegate и Invoke:

  1.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.         Dim d_Thread As New System.Threading.Thread(AddressOf Thread)
  3.         'если поток с параметрами, то передовать так:
  4.         'Dim param1(4) As Object
  5.         'param1(0) = "параметр 1"
  6.         'param1(1) = "параметр 2"
  7.         'param1(2) = "параметр 3"
  8.         'param1(3) = "..."
  9.         'param1(4) = "параметр n"
  10.         'd_Thread.Start(param1)
  11.  
  12.         'или
  13.  
  14.         'd_Thread.Start(New Object() {"параметр 1", "параметр 2", "параметр 3", "...", "параметр n"})
  15.  
  16.         d_Thread.Start()
  17.     End Sub
  18.  
  19.     'Private Sub Thread(ByVal param As Object)
  20.     Private Sub Thread()
  21.         For d_Sch As Integer = 1 To 100000
  22.             'Dim param2(4) As Object
  23.             'param2(0) = "параметр 1"
  24.             'param2(1) = "параметр 2"
  25.             'param2(2) = "параметр 3"
  26.             'param2(3) = "..."
  27.             'param2(4) = "параметр n"
  28.             'ThreadProgressChanged(param2)
  29.  
  30.             'или
  31.  
  32.             'ThreadProgressChanged(New Object() {"параметр 1", "параметр 2", "параметр 3", "...", "параметр n"})
  33.  
  34.             ThreadProgressChanged(New Object() {d_Sch})
  35.         Next
  36.     End Sub
  37.  
  38.     'использование Delegate и Invoke
  39.     Private Delegate Sub SubWithParam(ByVal param As Object)
  40.     Private Sub ThreadProgressChanged(ByVal param As Object)
  41.         If Me.InvokeRequired Then
  42.             Me.Invoke(New SubWithParam(AddressOf ThreadProgressChanged), param)
  43.         Else
  44.  
  45.             'здесь пишите обработку param и вывод данных на форму
  46.             Me.Label1.Text = param(0)
  47.  
  48.         End If
  49.     End Sub
  50.  
  51.     'ПРЕДУПРЕЖДЕНИЕ!!!
  52.     'Частые передачи данных из потока ОЧЕНЬ замедляют его!


Удачи!

Ответить

Номер ответа: 4
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #4
Добавлено: 19.09.08 11:45
BackgroundWorker в 2008 студии - это такой контрол, который сам по себе отдельный поток. Работать с нип проще простого и все работает как часы.

Ответить

Номер ответа: 5
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #5 Добавлено: 19.09.08 13:34
Потоки тоже работают как часы и работать с ними еще проще.

Вызов Control.Invoke - это далеко не самая сложная проблема многопоточных приложений.

Ответить

Номер ответа: 6
Автор ответа:
 NeKoder



Вопросов: 1
Ответов: 3
 Профиль | | #6 Добавлено: 19.09.08 21:56
BackgroundWorker в 2008 студии - это такой контрол, который сам по себе отдельный поток. Работать с нип проще простого и все работает как часы.

Это я понял, я не понял как с ним работать (наверное я совсем тупой). Мыкался, тыркался, в итоге код ни разу не выполнился :(
То, что написал __Pavel__ я тоже не понял (точно тупой).
Чтобы разобраться, мне нужно, что кто-то показал мне как работать с потоками на моей "программе".
Если кто может - буду очень благодарен, если нет - буду биться неделю, но добьюсь, т.к. считаю, что начатое дело не надо бросать на пол пути, даже если не знаешь, что делать, всему можно научиться имея время и желание, а потом уже можно помогать другим, столкнувшимся с такой же проблемой. Да уж ... :) Понаписал ... :)

Ответить

Номер ответа: 7
Автор ответа:
 NeKoder



Вопросов: 1
Ответов: 3
 Профиль | | #7 Добавлено: 19.09.08 22:25
С BackgroundWorker'ом разобрался :)
Но он мне не помогает, т.к. с каждым новым подключением создается новый экземпляр класса и (как я понимаю) это уже получается другой поток :(

Ответить

Номер ответа: 8
Автор ответа:
 __Pavel__



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #8
Добавлено: 19.09.08 22:41
буду биться неделю, но добьюсь, т.к. считаю, что начатое дело не надо бросать на пол пути, даже если не знаешь, что делать, всему можно научиться имея время и желание

во! так и надо! =)
разбирайте мой код... поймете его поймете и BackgroundWorker... там ничего сложного нет...

скажите что именно не получается? передать данные в поток, вывести данные или создать поток и запустить?

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам