![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 0 Всего: 11 |
Хочу, чтобы тред-работник (назовём его "тред 2") в какой-то момент открывал диалоговое окно (назовём его "диалог") и спрашивал что-то у пользователя. При этом остальные треды чтобы продолжали работать.
При этом у меня есть другое окно (назовём его "окно"), надписи в котором обновляет другой тред-работник (назовём его "тред 1"). Такое впечатление, что они друг другу мешают, так как диалог получается какой-то тормознутый. Хотя я позаботился о том, чтобы тред 1 ничего не обновлял пока открыт диалог, всё равно диалог получается тормознутый. Как правильно запрограммировать такое поведение? Как вообще, в C# все окна тоже выполняются в одном специальном треде, как и в Джаве? Если да, то почему метод BeginInvoke принадлежит окну? |
|||
|
||||
| SpaceSpace |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 10.4.2007 Где: Самара Репутация: 2 Всего: 10 |
BeginInvok ивочит в контексте потока, в котором выполняется окно
там он наследуется от контрола или типа того. Это сообщение отредактировал(а) SpaceSpace - 30.10.2008, 17:48 -------------------- Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение. 70-565 MCPD Enterprise 3.5 |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
Нет, не в одном. Почему BeginInvoke к окну - бессмысленный вопрос, достаточно глянуть на его описание в MSDN: Executes the specified delegate asynchronously on the thread that the control's underlying handle was created on. Как именно позаботился? Крутишь поток в цикле while (!canContinue){} ? |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 0 Всего: 11 |
В таком случае, имею ли я право в любом потоке просто создать форму и открыть её в режиме диалога? Тогда ведь она должна быть совершенно независима от форм, открытых в других потоках.
тред1 -- это у меня тред-диспетчер. Он запускает другие треды, одним из примеров которого является описанный тред2, следит за их состоянием и выводит это состояние в своё окно. Тред1 оформлен в виде стандартного BackgroundWorker, синтаксически его рабочая функция является функцией-членом того окна, в которое он выводит сообщения. Поэтому использование метода BeginInvoke тут обычное штатное. Я сделал, чтобы тред1 обновлял состояние только в том случае, если оно изменилось. Но для этого ему приходится опрашивать тред2. И хотя я сделал этот опрос через синхнонизированную функцию, всё равно тред1 вмешивается в работу треда-2, так как лочит там объекты. Видимо, в этом и заключается ошибка. Правильнее, видимо, сделать, чтобы тред2 сам сообщал об изменении своего состояния. Как правильно? Первая мысль -- пусть тред2 вызывает call-back функцию. Кстати, а не являются ли event-ы в C# автоматически многопоточными? |
|||
|
||||
| SpaceSpace |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 10.4.2007 Где: Самара Репутация: 2 Всего: 10 |
да, мысль верная. при изменении состояния формочка сама должна оповестить диспетчера.
-------------------- Репутация - самое ценное, что есть у человека. Зарабатывают годы, теряют за мгновение. 70-565 MCPD Enterprise 3.5 |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |