![]() |
Модераторы: gambit, Partizan |
![]() ![]() ![]() |
|
amarenkov |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
Добрый день.
У меня во вторичном потоке происходят какие-то действия и иногда вызывается следующая функция:
На закрытии формы я выставляю вторичному потоку флаг на завершение. Если строчка с fobj_picture.Invoke закоментарена, то все нормально завершается. Если нет, то второй поток продолжает висеть и не завершается вообще никогда. Возможно кто-то знает, в чем дело? Заранее спасибо. Это сообщение отредактировал(а) amarenkov - 28.4.2008, 11:00 |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
Очень похоже на deadlock. Гуишный поток говорит второму потоку "завершайся" и ждёт, пока тот не завершится одним из способов (через событие, WaitHandle, проверкой IsAlive или Join-ом). В это время второй поток безуспешно пытается вызвать Invoke, который попросту не может выполниться т.к. Invoke основан на очереди оконных сообщений и не выполнится пока гуишный поток не выйдет из ожидания. Примерно так.
Выходом может быть вызов из гуишного потока thread.Abort и thread.Join(таймаут) второму потоку. В корневой функции второго потока нужно поставить try..catch(ThreadAbortException), чтобы сообщение об ошибке не вылетало. -------------------- ![]() |
|||
|
||||
amarenkov |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
mr.DUDA, у меня немного не так организовано приложение.
Вторичный поток крутится в бесконечном цикле, проверяя некоторый флаг. Когда флаг становится в true, вторичный поток просто завершает свою процедуру и завершается сам. То есть, в основном потоке завершение вторичного потока выглядит просто как установка флага в true. После чего, основной поток продолжает свое завершение. Есть подозрение, что в тот момент, когда вторичный поток делает Invoke, основного потока уже нет ![]() |
|||
|
||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
Если основной поток завершился, Invoke рухнет с исключением. Проверить можно поставив try..catch во втором потоке.
Кстати, ещё можно запустить в отладке, дойти до места где виснет и нажать "паузу" отладчика. В окне Debug/Windows/Threads посмотреть какие потоки выполняются и даблкликом пройтись по ним - покажет в каком месте в исходнике сейчас находится каждый поток. -------------------- ![]() |
|||
|
||||
amarenkov |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
mr.DUDA, сделал Abort и Join. Поток завершился, но исключения не вылетело. Что это может значить?
Добавлено через 2 минуты и 29 секунд Хм, показывает, что второй поток стоит на строчке
и ни с места ![]() Добавлено через 5 минут и 9 секунд Сделал так:
Стоит мертво на fobj_picture.Invoke(mi); |
||||
|
|||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 24 Всего: 232 |
А в анонимный метод заходит? Я бы вынес для отладки OnDCRefreshImage в отдельный метод и передавал делегат на него.
-------------------- ![]() |
|||
|
||||
amarenkov |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
Вынес. Нет, не заходит. Когда жму на паузу и смотрю данные объектов, то во всех полях fobj_picture написано, дескать "Текущий поток спит, ждет или джоин".
Вообще в Threads видно 7 каких-то потоков. Один - мой вторичный. Главный поток имел ID 3704. Так в момент подвеса этого потока уже вообще не видать в списке потоков. Он завершился что ли? |
|||
|
||||
amarenkov |
|
||||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 183 Регистрация: 21.2.2008 Где: Воронеж Репутация: нет Всего: нет |
Чуть подробнее о вторичном потоке.
Основная функция:
Пытаюсь его выключить:
Получается описанная выше проблема. Нашел такое еще решение:
т.е. пока вторичный поток не завершится, основной обрабатывает свои сообщения. Так делать нормально вообще? Второй вариант:
Тоже работает корректно - поток завершается. Никаких исключений не вызывается. Но мне как-то этот вариант не нравится. |
||||||||
|
|||||||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |