Страница: 1 |
Страница: 1 |
Вопрос: Потоки :((
Добавлено: 17.09.08 23:57
Автор вопроса: NeKoder
Доброго времени суток!
Пишу программку для передачи сообщений по сети (в целях понять, как это вообще), приходится использовать потоки, чтобы сообщения могли присылать несколько пользователей одновременно. Нужно приходящее сообщение поместить в TextBox на форме, понимаю, что надо использовать invoke, но не понимаю как :(( Пожалуйста, помогите, раньше с потоками не связывался, а вот теперь "приспичило". P.S.: MSDN видимо не для меня :(
Осн.:
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:
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
Надеюсь я вас правильно понял... вот пример использования Delegate и Invoke:
Удачи!
Номер ответа: 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
Это я понял, я не понял как с ним работать (наверное я совсем тупой). Мыкался, тыркался, в итоге код ни разу не выполнился
То, что написал __Pavel__ я тоже не понял (точно тупой).
Чтобы разобраться, мне нужно, что кто-то показал мне как работать с потоками на моей "программе".
Если кто может - буду очень благодарен, если нет - буду биться неделю, но добьюсь, т.к. считаю, что начатое дело не надо бросать на пол пути, даже если не знаешь, что делать, всему можно научиться имея время и желание, а потом уже можно помогать другим, столкнувшимся с такой же проблемой. Да уж ... Понаписал ...
Номер ответа: 7
Автор ответа:
NeKoder
Вопросов: 1
Ответов: 3
Профиль | | #7
Добавлено: 19.09.08 22:25
С BackgroundWorker'ом разобрался
Но он мне не помогает, т.к. с каждым новым подключением создается новый экземпляр класса и (как я понимаю) это уже получается другой поток
Номер ответа: 8
Автор ответа:
__Pavel__
Вопросов: 29
Ответов: 284
Web-сайт:
Профиль | | #8
Добавлено: 19.09.08 22:41
во! так и надо!
разбирайте мой код... поймете его поймете и BackgroundWorker... там ничего сложного нет...
скажите что именно не получается? передать данные в поток, вывести данные или создать поток и запустить?