Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Открыть диалог из треда 
:(
    Опции темы
Dims
Дата 30.10.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 0
Всего: 11



Хочу, чтобы тред-работник (назовём его "тред 2") в какой-то момент открывал диалоговое окно (назовём его "диалог") и спрашивал что-то у пользователя. При этом остальные треды чтобы продолжали работать. 

При этом у меня есть другое окно (назовём его "окно"), надписи в котором обновляет другой тред-работник (назовём его "тред 1"). 

Такое впечатление, что они друг другу мешают, так как диалог получается какой-то тормознутый. Хотя я позаботился о том, чтобы тред 1 ничего не обновлял пока открыт диалог, всё равно диалог получается тормознутый.

Как правильно запрограммировать такое поведение?

Как вообще, в C# все окна тоже выполняются в одном специальном треде, как и в Джаве?

Если да, то почему метод BeginInvoke принадлежит окну?
PM MAIL   Вверх
SpaceSpace
Дата 30.10.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 2
Всего: 10



BeginInvok  ивочит в контексте потока, в котором выполняется окно
там он наследуется от контрола или типа того.

Это сообщение отредактировал(а) SpaceSpace - 30.10.2008, 17:48


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
PashaPash
Дата 30.10.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



Цитата(Dims @  30.10.2008,  16:42 Найти цитируемый пост)
Как вообще, в C# все окна тоже выполняются в одном специальном треде, как и в Джаве?

Если да, то почему метод BeginInvoke принадлежит окну? 

Нет, не в одном. Почему BeginInvoke к окну - бессмысленный вопрос, достаточно глянуть на его описание в MSDN: Executes the specified delegate asynchronously on the thread that the control's underlying handle was created on.

Цитата(Dims @  30.10.2008,  16:42 Найти цитируемый пост)
Такое впечатление, что они друг другу мешают, так как диалог получается какой-то тормознутый. Хотя я позаботился о том, чтобы тред 1 ничего не обновлял пока открыт диалог, всё равно диалог получается тормознутый.

Как именно позаботился? Крутишь поток в цикле while (!canContinue){} ?


--------------------
PM MAIL WWW   Вверх
Dims
Дата 1.11.2008, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 0
Всего: 11



Цитата(PashaPash @  30.10.2008,  18:04 Найти цитируемый пост)
Нет, не в одном.

В таком случае, имею ли я право в любом потоке просто создать форму и открыть её в режиме диалога? Тогда ведь она должна быть совершенно независима от форм, открытых в других потоках.

Цитата(PashaPash @  30.10.2008,  18:04 Найти цитируемый пост)
Как именно позаботился? Крутишь поток в цикле while (!canContinue){} ? 

тред1 -- это у меня тред-диспетчер. Он запускает другие треды, одним из примеров которого является описанный тред2, следит за их состоянием и выводит это состояние в своё окно. Тред1 оформлен в виде стандартного BackgroundWorker, синтаксически его рабочая функция является функцией-членом того окна, в которое он выводит сообщения. Поэтому использование метода BeginInvoke тут обычное штатное.

Я сделал, чтобы тред1 обновлял состояние только в том случае, если оно изменилось. Но для этого ему приходится опрашивать тред2. И хотя я сделал этот опрос через синхнонизированную функцию, всё равно тред1 вмешивается в работу треда-2, так как лочит там объекты.

Видимо, в этом и заключается ошибка. Правильнее, видимо, сделать, чтобы тред2 сам сообщал об изменении своего состояния. 

Как правильно?

Первая мысль -- пусть тред2 вызывает call-back функцию.

Кстати, а не являются ли event-ы в C# автоматически многопоточными?
PM MAIL   Вверх
SpaceSpace
Дата 1.11.2008, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 366
Регистрация: 10.4.2007
Где: Самара

Репутация: 2
Всего: 10



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


--------------------
Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение.
70-565
MCPD Enterprise 3.5 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.