Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Vb .net и многопоточность UI


Автор: apor 14.5.2009, 00:02
Столкнулся с проблемой. Есть форма (Threadform), на ней две кнопки: start (bStart) и stop (bStop), и TextBox (tBox). Задача такая, чтобы при нажатии на Start запускался цикл и выводил на TextBox сообщения, а при нажатии Stop он заканчивал свою работу, но все это должно деалаться не в главном потоке, т.к. нужен доступ к пользовательскому интерфейсу, а он, в связи с тем, что цикл непрерывный, не отвечает на команды пользователя.
Я испльзовал здесь метод BeginInvoke, думаю, что реализовать идею можно только с его применением. Но результат отрицательный, форма не отвечает на команды. В чем кроется проблема, друзья?
Код

Imports System.Threading
Public Class Threadform
    Private StopFlag As Boolean
    Delegate Sub InvokeDelegate()
    Public Sub Print(ByVal Message As String)
        With tBox
            .SelectionStart = .Text.Length
            .SelectedText = vbCrLf & Message
        End With
    End Sub

    Sub DoTheWork()
        Do
            Print("message...")
        Loop Until StopFlag
    End Sub
   
    Private Sub bStop_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bStop.Click
        StopFlag = True
        bStart.Enabled = True
    End Sub

    Private Sub bStart_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bStart.Click
        StopFlag = False
        bStart.Enabled = False
        tBox.BeginInvoke(New InvokeDelegate(AddressOf DoTheWork))
    End Sub
End Class


Автор: diadiavova 14.5.2009, 00:40
Я там слегка переделал, разберёшься, я думаю.

Автор: apor 14.5.2009, 01:53
Браво, diadiavova!!! На 2-ух форумах я задал это вопрос, но только ты дал внятный ответ smile 
 Я немного переделал твой пример как мне надо, теперь поток запускается после нажатия кнопки.

Автор: diadiavova 14.5.2009, 01:55
Ну дык....форум надо правильно выбирать smile 

Автор: -Mikle- 14.5.2009, 09:12
Цитата(diadiavova @  14.5.2009,  04:55 Найти цитируемый пост)
Ну дык....форум надо правильно выбирать 

Да, да! Приходи к нам! Здесь тебе помогут обязательно  smile !

Автор: diadiavova 14.5.2009, 13:59
Я так понимаю, один из "форумов", на которых тебе не помогли находится здес
http://otvet.mail.ru/question/25302479/?
Нашёл где спросить smile

Автор: apor 14.5.2009, 16:42
Верно, но ответ по теме там уже получен))

Автор: diadiavova 14.5.2009, 18:31
А я и не говорю, что это невозможно(сам там торчу иногда) просто шансы получить там более-менее внятный ответ крайне невелики. Да и не приспособлены "ответы" для этого.

Автор: taratonov 5.9.2010, 12:10
Есть несколько вопросов:
1. Зачем использовать флаг StopFlag (как показано в ваших примерах) ведь метод DoTheWork прекрашает выполнение при вызове _thr.Abort() из bStop_Click.

2. Правильно ли завершать поток следующим образом: _thr.Abort()  +  _thr.Join()? Или нужно использовать _thr.Abort() + ThreadAbortException?

Спасибо.

Код

Imports System.Threading

Public Class Form1

    Delegate Sub PrintDelegate(ByVal msg As String)
    Dim _thr As New Thread(AddressOf DoTheWork)

    Public Sub Print(ByVal Message As String)
        Label1.Text = Message
    End Sub

    Sub DoTheWork()
        Dim i As Integer = 0

        Do
            Me.Invoke(New PrintDelegate(AddressOf Print), "message..." & i)
            Thread.Sleep(1000)
            i = i + 1
        Loop While True

    End Sub

    Private Sub bStop_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn_stop.Click
        [color=red]_thr.Abort()
        _thr.Join()[/color]
        btn_stop.Enabled = False
        btn_start.Enabled = True
    End Sub

    Private Sub bStart_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn_start.Click
        _thr.Start()
        btn_start.Enabled = False
        btn_stop.Enabled = True
    End Sub

End Class

Модератор: и разметочкой не забываем пользоваться

Автор: diadiavova 5.9.2010, 12:48
Интересно, кто это будет спустя полтора года вспоминать чего он там когда-то писал?
На счет StopFlag вообще не понял о чем речь.

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