данные из потока в контрол на форме

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

самообучающийся
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 20.08.2008 (Ср) 12:13

данные из потока в контрол на форме

Сообщение самообучающийся » 21.08.2008 (Чт) 12:57

здраствуйте
извиняюсь за "избитую" тему , ну что то на других примерах так и не смог понять :(
если можно приведите пример правильного использования, для примера простенький код,для своих целей я уже на вашем примере разберусь.

есть форма form1 на ней контролы: TextBox1, BackgroundWorker1,Button1
...........................................................
Код: Выделить всё
    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        f_test_thread()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        BackgroundWorker1.RunWorkerAsync()
    End Sub

..........................................................

есть модуль test:
Код: Выделить всё
Module test
    Public Sub f_test_thread()
        Dim i As Integer = 0
        For i = 0 To 100
            If i = 10 Then form1.TextBox1.Text = form1.TextBox1.Text & i & ":"
            If i = 50 Then form1.TextBox1.Text = form1.TextBox1.Text & i & ":"
            If i = 90 Then form1.TextBox1.Text = form1.TextBox1.Text & i & ":"
        Next
    End Sub
End Module


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

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: данные из потока в контрол на форме

Сообщение Viper » 21.08.2008 (Чт) 13:23

Твой код успешно заполняет поле ввода в форме. В чем конкретный вопрос то?
Весь мир матрица, а мы в нем потоки байтов!

самообучающийся
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 20.08.2008 (Ср) 12:13

Re: данные из потока в контрол на форме

Сообщение самообучающийся » 21.08.2008 (Чт) 13:52

странно ...
у меня выкидывает : InvalidOperationException was unhandled by user code.
An error occurred creating the form. See Exception.InnerException for details. The error is: ActiveX control '8856f961-340a-11d0-a96b-00c04fd705a2' cannot be instantiated because the current thread is not in a single-threaded apartment.

а не может ли возникать проблемма из за того что у меня на form1 несколько контролов BackgroundWorker ?

самообучающийся
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 20.08.2008 (Ср) 12:13

Re: данные из потока в контрол на форме

Сообщение самообучающийся » 21.08.2008 (Чт) 14:35

более подробно о своей задаче , может так будет проще понять в чём у меня сложность.
В программе должно использоваться несколько потоков, один начинает работать с момента запуска программы и до остановки, остальные потоки должны начинать работать по мере необходимости, то есть в момент когда пользователь запускает те или иные функции программы. В программе должны одновременно работать как минимум 2 потока и мне надо что бы из всех работающих потоков данные поступали на контролы в основной форме.Я пытаюсь это делать , запускать потоки, с помощью контролов BackgroundWorker , все они распологаются на основной форме, код функций для работы в потоках распологаются в отдельных модулях (как в приведённом примере).

Может подскажите как правильно реализовать такую функцианальность ?

самообучающийся
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 20.08.2008 (Ср) 12:13

Re: данные из потока в контрол на форме

Сообщение самообучающийся » 21.08.2008 (Чт) 15:08

создал новый проект(чистый код).
Form1
Код: Выделить всё
Public Class Form1

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        f_test_thread()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        BackgroundWorker1.RunWorkerAsync()
    End Sub

End Class


модуль
Код: Выделить всё
Module Module1
    Public Sub f_test_thread()
        Dim i As Integer = 0
        For i = 0 To 100
            If i = 5 Then
                Form1.TextBox1.Text = Form1.TextBox1.Text & i & ":"
                MsgBox(i)
            End If

            If i = 50 Then
                Form1.TextBox1.Text = Form1.TextBox1.Text & i & ":"
                MsgBox(i)
            End If

            If i = 90 Then
                Form1.TextBox1.Text = Form1.TextBox1.Text & i & ":"
                MsgBox(i)
            End If
        Next
    End Sub
End Module


MsgBox работает , а TextBox1 остаётся пустым, не заполняется :(

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: данные из потока в контрол на форме

Сообщение Viper » 21.08.2008 (Чт) 15:39

Для взаимодействия с объектами интерфейса из других потоков необходимо использовать метод Invoke. Примеры использования есть здесь на форуме, а также весьма стоит внимательно изучить MSDN по этому вопросу.
З.Ы. Обрати внимание на пункт VI.16 Правил форума. На первый раз просто устное замечание.
Весь мир матрица, а мы в нем потоки байтов!

самообучающийся
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 20.08.2008 (Ср) 12:13

Re: данные из потока в контрол на форме

Сообщение самообучающийся » 21.08.2008 (Чт) 15:56

так вот поэтому я и задал вопрос, потому что не смог сам разобраться , если бы все сами могли разобраться с помощью MSDN то думаю такие форумы бы загнивали на корню ....
я просто попросил пример как правильно реализовать код с использованием потоков и Invoke . Не все знают английский и на 100% знают VB.Net , для этого я думал и создан этот форум что бы помогать новичкам разобраться с тем что они не понимают.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: данные из потока в контрол на форме

Сообщение Sebas » 21.08.2008 (Чт) 16:27

самообучающийся писал(а):так вот поэтому я и задал вопрос, потому что не смог сам разобраться , если бы все сами могли разобраться с помощью MSDN то думаю такие форумы бы загнивали на корню ....
я просто попросил пример как правильно реализовать код с использованием потоков и Invoke . Не все знают английский и на 100% знают VB.Net , для этого я думал и создан этот форум что бы помогать новичкам разобраться с тем что они не понимают.
- на форуме ответов не меньше 10, замечание по существу
-Invoke использовать необязательно. Почитай о событии ReportProgress

Да и имей ввиду, что Солдат(MsgBox) - спит, а служба(второй поток) идёт
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

самообучающийся
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 20.08.2008 (Ср) 12:13

Re: данные из потока в контрол на форме

Сообщение самообучающийся » 22.08.2008 (Пт) 7:51

спасибо что помогли :(
отличный форум !

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: данные из потока в контрол на форме

Сообщение Viper » 22.08.2008 (Пт) 11:41

самообучающийся писал(а):спасибо что помогли :(
Сомневаешься, что тебе помогли? Ответ номер раз:
Viper писал(а):Для взаимодействия с объектами интерфейса из других потоков необходимо использовать метод Invoke. Примеры использования есть здесь на форуме
Ответы номер два и три:
Sebas писал(а):-Invoke использовать необязательно. Почитай о событии ReportProgress

Да и имей ввиду, что Солдат(MsgBox) - спит, а служба(второй поток) идёт
Поиск работает, здесь, на форуме. Или за тебя примеры использования найти?
самообучающийся писал(а):отличный форум !
Несомненно.
ADD: А Поиск то не работает :(. Вернее работает, но в пределах сообщений, оставленых после переезда. Автору топика приносятся извинения.
Весь мир матрица, а мы в нем потоки байтов!

самообучающийся
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 20.08.2008 (Ср) 12:13

Re: данные из потока в контрол на форме

Сообщение самообучающийся » 23.08.2008 (Сб) 18:06

через поиск я нашёл три сообщения с Invoke , и все они оказались с данного топика ...
Я в ручную просматривал сообщения данного форума , но так ничего понятного для себя и не нашёл , простого понятного примера нет , везде коды в 300 строк и где на что ссылается какая процедура и тому подобное устанешь разбераться :(
я просто просил показать чистый код :( , а дальше я бы и сам разобрался как его применить в своей программе. Я никого не прошу всё делать за меня и не выставляю все свои коды для того что бы кто то их правил и правильно писал , но и в чужих кодах тоже не всегда просто разобраться начинающему.

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: данные из потока в контрол на форме

Сообщение Williams » 24.08.2008 (Вс) 15:08

Если автору нужен конкретно пример Invoke, то вот:

Код: Выделить всё
    Delegate Sub ModifyControlDelegate(ByVal ControlText As String)

    Private Sub ModifyControl(ByVal ControlText As String)
        If Control.InvokeRequired Then

            Dim Invoker As New ModifyControlDelegate(AddressOf ModifyControl)
            Control.Invoke(Invoker, New Object() {ControlText})


        Else

            Control.Text = ControlText

        End If

    End Sub

Разумеется, Control следует заменить на нужный элемент управления, например TextBox1. Используется как обычно - ModifyControl (Value)
И вы думаете, что вас оставят в живых после прочтения этого поста?

самообучающийся
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 20.08.2008 (Ср) 12:13

Re: данные из потока в контрол на форме

Сообщение самообучающийся » 25.08.2008 (Пн) 12:40

Williams может ещё подскажешь как твой код прикрутить к тому который у меня в начале топика ? уже башку сломал , не могу додуматься :(

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: данные из потока в контрол на форме

Сообщение Williams » 25.08.2008 (Пн) 23:51

самообучающийся писал(а):Williams может ещё подскажешь как твой код прикрутить к тому который у меня в начале топика ? уже башку сломал , не могу додуматься :(


Что именно не получается? Назови процедуру ChangeTextBox по образцу с Invoke и передавай нужное значение в качестве параметра.


If i = 10 Then form1.TextBox1.Text = form1.TextBox1.Text & i & ":"

изменится на

if i = 10 then modifytextbox (form1.TextBox1.Text & i & ":")
И вы думаете, что вас оставят в живых после прочтения этого поста?


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 90

    TopList  
cron