Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Потоки в VB .Net 2008

1.8K
10 июля 2008 года
NextTime
217 / / 19.12.2007
с самими потоками разобрался вроде... Ну по крайней мере понимаю норм этот пример из книги:
Код:
Dim Поток1 As New System.Threading.Thread(AddressOf Процесс_потока1)
Dim Поток2 As New System.Threading.Thread(AddressOf Процесс_потока2)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Поток1.Start()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Поток2.Start()
End Sub

Private Sub Процесс_потока1()
        Dim i As Integer = 1
        Do
            TextBox1.Text = i
            Debug.WriteLine("Работает 1 поток:" & i)
            i += 1
        Loop
End Sub

Private Sub Процесс_потока2()
        Dim i As Integer = 1
        Do
            TextBox2.Text = i
            Debug.WriteLine("Работает 2 поток:" & i)
            i += 1
        Loop
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles But-ton3.Click
        MsgBox("Привет!")
End Sub

А вот про безопасные потоки, про BeginInvoke, Invoke, EndInvoke поняять ни чего не могу. Нашел в инете несколько статей, но ниче не пойму, как обратиться к объекту безопаснор? помогите ссылкой с легким объяснением или сами плиз объясните....
1.8K
10 июля 2008 года
NextTime
217 / / 19.12.2007
нашел ответ на форуме этом...
 
Код:
private SetLabelText(Label lbl, string text) {    
    if(lbl.InvokeRequired) {
        lbl.Invoke(new ThreadStart(delegate {
            SetLabelText(lbl, text);
        }));
    } else {
        lbl.Text = text;
    }
}

объясните шоль че такое делегат и вообоще строку lbl.Invoke(new ThreadStart(delegate {
SetLabelText(lbl, text);
плиз
5
10 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: NextTime
нашел ответ на форуме этом...
 
Код:
private SetLabelText(Label lbl, string text) {    
    if(lbl.InvokeRequired) {
        lbl.Invoke(new ThreadStart(delegate {
            SetLabelText(lbl, text);
        }));
    } else {
        lbl.Text = text;
    }
}
объясните шоль че такое делегат и вообоще строку lbl.Invoke(new ThreadStart(delegate {
SetLabelText(lbl, text);
плиз

Доступ к свойствам компонента (по-умолчанию) ограничен потоком (thread), в котором он создан. Чтобы модифицировать значение свойства ли вызвать некоторый метод требуется выполнить синхронизацию потоков. Синхронизация достигается вызовом метода Invoke. В качестве параметра этот метод требует делегат - простыми словами, указатель на некоторую функцию.
Чтобы не создавать вспомогательный метод и не захламлять тем самым код класса (еще потребуется передавать туда значения!) я использовал анонимный метод (объявляется в теле метода через ключевое слово delegate) и обернул его в строго типизированную форму функции без параметров (тип делегата ThreadStart вполне подходит для этого, но потоки тут не создаются, уверяю вас) - этот цирк нужен для передачи в Invoke нашего анонимного метода.
Прощ говоря, я выполняю рекурсивный вызов той же самой функции SetLabelText с теми же параметрами, но уже в синхронизированном контексте.

1.8K
11 июля 2008 года
NextTime
217 / / 19.12.2007
Огромное спасибо, теперь понятнее:)а что такое BeginInvoke и EndInvoke. Заранее благодарен
5
11 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: NextTime
Огромное спасибо, теперь понятнее:)а что такое BeginInvoke и EndInvoke. Заранее благодарен

Цель работы этой связки такая же как и Invoke.
Это просто асинхронный вариант вызова Invoke. Вообще XXX, BeginXXX, EndXXX можно увидеть во многих местах - это стандартный подход.
Дело в том, что Invoke блокирует работу текущего потока на время выполнения того делегата. Иногда это может занять отностильно много времени, потому чтобы избежать моментальной блокировки (например чтобы выполнить какие-то еще полезные действия) используют BeginInvoke. Можно сказать (на самом деле это несовсем так), что BeginInvoke создает новый поток исполнения, в котором выполняется оригинальный Invoke. Помимо этого BeginInvoke возвращает специальный объект типа IAsyncResult, который нужен для завершения асинхронной операции через EndInvoke. Какраз таки EndInvoke может блокировать текущий поток исполнения до завершения вызова делегата (если до вызова EndInvoke код делегата полностью выполнился, то, конечно, блокировки не будет).

Обычно эта связка используется так:

 
Код:
IAsyncResult async = control.BeginInvoke(бла-бла-бла);
// какието действия
....
control.EndInvoke(async); // дожидаемся завершения инвоука
1.8K
11 июля 2008 года
NextTime
217 / / 19.12.2007
Не могли бы бы дать ссылку, где можно почитать про потоки, их синхронизацию на простом языке, а то везде на тяжелом языке и с огромными примерами...
5
12 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: NextTime
Не могли бы бы дать ссылку, где можно почитать про потоки, их синхронизацию на простом языке, а то везде на тяжелом языке и с огромными примерами...

Вот уж не знаю. По хорошему этот вопрос входит в университетский курс операционных систем. Ищите на тему семафоров Дейкстры - это матчасть - на них в принципе строится любая синхронизация.

1.8K
12 июля 2008 года
NextTime
217 / / 19.12.2007
мну просто 16 лет)) оч люблю программировать... Учусь на АСУ...Ужас)
1.8K
12 июля 2008 года
NextTime
217 / / 19.12.2007
Понимаю, что я ламер и достал тебя... Но ты мне дал код на C# .Net кажись, а я на VB.Net подсел)))я переделал код так:
Код:
Public Class Form1
    Dim Поток As New Threading.Thread(AddressOf Процесс_Потока)
    Private Sub SetLabelText()
        If lbl.InvokeRequired Then
            lbl.Invoke(New Threading.ThreadStart(AddressOf SetLabelText))
        Else
            lbl.Text = "Text"
        End If
    End Sub

    Private Sub Процесс_Потока()
        SetLabelText()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Поток.Start()
    End Sub
End Class

Все работает тип топ!
А если чисто перенести код с твоей платформы на мою, то не работает...:
Код:
ublic Class Form1
    Dim Поток As New Threading.Thread(AddressOf Процесс_Потока)
    Private Sub SetLabelText()
        If lbl.InvokeRequired Then
            lbl.Invoke(New Threading.ThreadStart(delegate(SetLabelText(lbl, text))
        Else
            lbl.Text = "Text"
        End If
    End Sub

    Private Sub Процесс_Потока()
        SetLabelText()
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Поток.Start()
    End Sub
End Class

Подчекркивает
 
Код:
delegate(SetLabelText(lbl, text)
, при наведении на delegate говорит Expression Expected(требуется объявление), а при наведении на говорит: Delegate System.Threading.ThreadStart requires an 'AddressOf' expression or lambda expression as the only argument to its constructor
и пробовал ставить AddressOf b четока не делал - ерунда, не робит с параметрами че делать, поомогите,?
14K
12 июля 2008 года
stimpi
100 / / 04.09.2007
вот ссылка, там правда C#, но все равно одни и те же библиотеки что на VB.NET, там рассказывается основы потоков все с примерами, должно помочь.

читай на здоровье
14K
12 июля 2008 года
stimpi
100 / / 04.09.2007
Цитата: NextTime
Подчекркивает
 
Код:
delegate(SetLabelText(lbl, text)
, при наведении на delegate говорит Expression Expected(требуется объявление), а при наведении на говорит: Delegate System.Threading.ThreadStart requires an 'AddressOf' expression or lambda expression as the only argument to its constructor
и пробовал ставить AddressOf b четока не делал - ерунда, не робит с параметрами че делать, поомогите,?



Наверное hardcase хотел сказать что ты должен сначала объявить делегат а потом его там использовать.

Код:
delegate void UpdateLabelText(string text);
.
.
.
 private void UpdateState(string value)
        {
            if (lbl.InvokeRequired)
            {
                lbl.Invoke(new UpdateLabelText(UpdateState), new object[] { value });
            }
            else
            {
                lbl.Text = value;
            }
}
PS можно также использовать анонимный делегат.
1.8K
12 июля 2008 года
NextTime
217 / / 19.12.2007
огромное спс, позже почитаю. блин, как на этом форуме плюсы ставить, поставил бы вам двоим по плюсику))
1.8K
13 июля 2008 года
NextTime
217 / / 19.12.2007
Код:
delegate void UpdateLabelText(string text);
.
.
.
 private void UpdateState(string value)
        {
            if (lbl.InvokeRequired)
            {
                lbl.Invoke(new UpdateLabelText(UpdateState), new object[] { value });
            }
            else
            {
                lbl.Text = value;
            }
}
PS можно также использовать анонимный делегат.[/QUOTE]

Вот, переделал под VB.Net, работает. Проверьте как правильно я понимаю. Статью еще не читал, которую последнюю мне дали...некогда пока....
Код:
Dim Поток As New Threading.Thread(AddressOf процесс_потока) ' создаем поток с телом в процедуре процесс_потока
    Delegate Sub UpdateLabelText(ByVal text As String) ' Создаем делегат с именем UpdateLabelText и параметром text(нпонятно как то..) Делегат это ж ссылка н процуедуру? так где тут ссылка?
    Private Sub UpdateState(ByVal value As String) 'Процедура UpdateState
        If lbl.InvokeRequired Then 'Если объект требует синхронизации(т.е. он не порожден этим потоком), то
            lbl.Invoke(New UpdateLabelText(AddressOf UpdateState), value) ' несовсем понятно...((Синхронизируем основной поток(где создан объект) с этим, передавая делегат(ссылку) рекурсивно(на эту же процедуру) и передаем этой прцедуре параметры в массиве( в данном случае один - value)
        Else
            lbl.Text = value 'Если объект поражден им(или уже синхронизированы потоки), то тупо меняем свойство
        End If
    End Sub

    Private Sub процесс_потока()
        UpdateState("проверка") ' Вызываем процедуру из потока
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Поток.Start() ' итак ясно...
    End Sub
5
13 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: NextTime
Вот, переделал под VB.Net, работает. Проверьте как правильно я понимаю.

Да, верно понимаешь ;)

Цитата:
Создаем делегат с именем UpdateLabelText и параметром text(нпонятно как то..) Делегат это ж ссылка н процуедуру? так где тут ссылка?

В той строке ты не создаешь делегат. Ты его объявляешь. Т.е. сообщаешь компилятору что сущесвтует некоторое семейство методов (Sub-рутин) UpdateLabelText с одним параметром типа строка.
А создаешь конкретный экземпляр делегата вот этой строкой:
New UpdateLabelText(AddressOf UpdateState)


P.S. Плюсик ставится нажатием на весы слева от сообщения, под аватарой.

1.8K
15 июля 2008 года
NextTime
217 / / 19.12.2007
Частично почитал статью... Вот скажите, Если поток заершился или преран, то его нельзя поторить(из книги из этой и из практики ясно). и че? заного создавать ноый поток на эту процедуру?Эт ж не логично, на создание нового потока уходит не мало времени. Может есть какие нибудь приемчики использоания одного и того же потока несколько раз? Несчитая попытки не дать ему заершиться(цикл нем)...
P.S. Уже полоина клавиш на клаве плохо работают, так что простите за очепятки;)
5
16 июля 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: NextTime
Вот скажите, Если поток заершился или преран, то его нельзя поторить(из книги из этой и из практики ясно). и че? заного создавать ноый поток на эту процедуру?Эт ж не логично, на создание нового потока уходит не мало времени.

Да, объект Thread - одноразовый. Для создания экземпляра объекта уходит совсем мало времени (стремится к нулю). Относительно долго выполняется метод Start - но это издержки архитектуры NT. Для частого и быстрого создания потоков управления существует пул потоков: ThreadPool. Эта ситемная структура содержит конечное количество потоков (обычно достаточное для настольного приложения) и позволяет быстро создавать нитку.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог