форма и многопоточность

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

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

neprden
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 04.10.2003 (Сб) 19:37

форма и многопоточность

Сообщение neprden » 29.11.2006 (Ср) 19:42

в отдельном потоке меняю свойство формы например Text , внутри потока оно меняется ето видно если его вывести после смены - там же внутри потока .. однако реально смены заголовка формы не происходит .. такое ощущение что с разными экземплярами работают .
Вопрос - как в потоке (запущенным мной) поменять текст основной формы .. Вернее не так .. как обратится именно к етому экземпляру формы , пример с text - ето просто упрощение чтобы код не приводить на самом деле интересует доступ к переменной - (где экземпляр класса "очередь") объявленный глобально в классе формы..
п.с ессно сендмесадж не предлагать
вот код допустим такой

Код: Выделить всё

Private Class pngs

        Private Sub png1()
            Form1.Text = "ee"
        End Sub

        Public Sub aaaa()
            Dim s1 As New System.Threading.Thread(AddressOf png1)
            s1.Start()
        End Sub
    End Class
........................
Dim a1 As New pngs
a1.aaaa

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 30.11.2006 (Чт) 0:05

Во-первых, использовать напрямую методы (в т.ч. менять значения свойств) контролов (и форм) из других потоков мягко говоря нехорошо. Есть 4 безопасных для использования из любого потока метода - InvokeRequired, Ivoke(), BeginInvoke(), EndInvoke(). Если в каком-либо потоке InvokeRequired = True, значит для обращения к свойствам/методам формы (контрола) необходимо использовать Invoke/BeginInvoke. Они выполнят переданный им в качестве параметра делегат соответственно синхронно/асинхронно в том потоке, в котором форма была создана (т.е. корректно).
Во-вторых, что такое Form1? Класс? Экземпляр класса? Я давненько на VB.NET 2005 не писал; там что, опять дефолтовый экземпляр класса формы создается? Если так, то я бы рекомендовал все-таки определиться с понятиями, где класс, а где экземпляр, и хотя бы именовать их по-разному.
Доступ к переменной формы не требует Invoke/BeginInvoke, но если с этой переменной работает несколько потоков (а это почти наверняка так), необходимо обеспечить синхронизацию (если таковая не обеспечивается внутренним устройством класса "очередь") - критические области, семафоры, события и т.п.
Ну и наконец, есть такой атрибут ThreadStatic, который говорит о том, что отмеченное им статическое поле имеет уникальное значение для каждого потока (то, что он используется - весьма маловероятная ситуация).

neprden
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 04.10.2003 (Сб) 19:37

Сообщение neprden » 30.11.2006 (Чт) 15:15

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

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

Сообщение Viper » 30.11.2006 (Чт) 15:27

Объекты для синхронизации в NET есть. Те же семафоры, например... Посмотрим на пространство имен System.Threading
Весь мир матрица, а мы в нем потоки байтов!

neprden
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 04.10.2003 (Сб) 19:37

Сообщение neprden » 30.11.2006 (Чт) 15:49

примерчик маленький как ими пользоватся можно ? .. есть 3 потока которые нечто ложат в очередь и сбрасывают семафор
1 поток - структура : бесконечный цикл - спит на семаворе , как только его сбросили естественно проснулся извлек из очереди что надо и релизами опять установил семафор и на нем же заснул ..
именно используя нетовский объект семафор как ето осуществить подскажите плз

mad_Max
Бывалый
Бывалый
 
Сообщения: 203
Зарегистрирован: 15.09.2002 (Вс) 21:17
Откуда: Russia, Cherepovets

Сообщение mad_Max » 30.11.2006 (Чт) 22:02

Объект Semaphore из System.Threading. Создаешь объект такого типа. Semaphore наследует от WaitHandle, значит у него есть метод WaitOne() - эквивалент API WaitForSingleObject(). Есть метод Release().
Создание семафора:
Dim sema As New Semaphore(1, 1)
Первое число - начальный счетчик семафора; 2е - максимальное значение счетчика.
В потоке:
'....
sema.WaitOne() 'сбрасываем семафор (спим, если нечего сбрасывать)
'... работаем ...
sema.Release()
'...
Но необязательно семафоры использовать. Скорее всего, будет достаточно Monitor.Enter() и Monitor.Leave(), но это кому как.

neprden
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 04.10.2003 (Сб) 19:37

Сообщение neprden » 01.12.2006 (Пт) 12:32

все работает огромное спасибо ..


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

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

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

    TopList