информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Утекший код XP и Windows Server... 
 Дела виртуальные 
 Простое пробивание рабочего/провайдерского... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
совет 19.04.05 12:35  Число просмотров: 1593
Автор: _йцукенг_ Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Столкнулся с проблемой связанной с функцией
> WaitForMultipleObjects.... При использовании данной функции
> в MFC приложении, прога виснет намертво, и мне никак не
> отловить завершения потоков...
> Причем заметил, что если вызывать её в деструкторе класса
> окна, она отрабатывает на ура! Все контролы успевают
> помереть до вызова деструктора, а вот если вызывать к
> примеру при нажатии кнопки, прога виснет...

Итак, что мы имеем.
1) у тебя есть многопоточное MFC-приложение
2) в обработчике события нажатия на кнопку ты вызываешь WaitForMultipleObjects с бесконечным таймаутом, ожидая завершения работы потоков.
3) прога виснет.
4) если вызывать ф-ю в деструкторе класса окна, все нормально.

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

рекомендую для того, чтобы сказать потокам о том, что пора закругляться с работой, использовать Event.
пусть они его проверяют, и если он выставлен, завершаются.

PS. MFC не виноват.
<programming>
[C++] Траблы с WaitForMultipleObjects 19.04.05 10:09  
Автор: alex_b Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Привет всем!

Столкнулся с проблемой связанной с функцией WaitForMultipleObjects.... При использовании данной функции в MFC приложении, прога виснет намертво, и мне никак не отловить завершения потоков...
Причем заметил, что если вызывать её в деструкторе класса окна, она отрабатывает на ура! Все контролы успевают помереть до вызова деструктора, а вот если вызывать к примеру при нажатии кнопки, прога виснет... Скорее всего это всязано с MFCшными фишками приложения, оно создано, как MFC application

Никто не знает, как обойти сей баг, или как можно в MFCшном приложении грамотно дождаться завершения потоков?

С Уважением,
Алексей...
ох! messages, messages, messages! 19.04.05 22:16  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
> Привет всем!
>
> Столкнулся с проблемой связанной с функцией
> WaitForMultipleObjects.... При использовании данной функции
> в MFC приложении, прога виснет намертво, и мне никак не
> отловить завершения потоков...
> Причем заметил, что если вызывать её в деструкторе класса
> окна, она отрабатывает на ура! Все контролы успевают
> помереть до вызова деструктора, а вот если вызывать к
> примеру при нажатии кнопки, прога виснет... Скорее всего
> это всязано с MFCшными фишками приложения, оно создано, как
> MFC application
>
> Никто не знает, как обойти сей баг, или как можно в MFCшном
> приложении грамотно дождаться завершения потоков?
>
> С Уважением,
> Алексей...

ох! messages, messages, messages!

используй MsgWaitForMultipleObjects например вот так:

bool WaitWithMessageLoop(HANDLE hEvent)
{
	DWORD dwRet;
	MSG msg;

	while(1)
	{
		dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, INFINITE, QS_ALLINPUT);

		if(dwRet == WAIT_OBJECT_0)
			return true;    // The event was signaled

		if(dwRet != WAIT_OBJECT_0 + 1)
			return false;          // Something else happened

		// There is one or more window message available. Dispatch them
		while(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
		{
			if(WM_QUIT == msg.message)
				return false;//application terminates
			TranslateMessage(&msg);
			DispatchMessage(&msg);
			if(WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0)
				return true; // Event is now signaled.
		}
	}
	return false;//never goes here
}

---
ну раз ты завел разговор об этом, то можно еще вспомнить о MsgWaitForMultipleObjectsEx 20.04.05 12:42  
Автор: _йцукенг_ Статус: Незарегистрированный пользователь
<"чистая" ссылка>
MsgWaitForMultipleObjectsEx рулит;-)
конечно можно, но только для MFC это не актуально 20.04.05 20:49  
Автор: + <Mikhail> Статус: Elderman
<"чистая" ссылка>
[C++] Скорее всего это связано с тем, что ты не освобождаешь сии объекты... 19.04.05 13:44  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
Деструктор их прибивает и они освобождаются. Потому в деструкторе не виснет.

В общем: "Код - в студию!"
совет 19.04.05 12:35  
Автор: _йцукенг_ Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Столкнулся с проблемой связанной с функцией
> WaitForMultipleObjects.... При использовании данной функции
> в MFC приложении, прога виснет намертво, и мне никак не
> отловить завершения потоков...
> Причем заметил, что если вызывать её в деструкторе класса
> окна, она отрабатывает на ура! Все контролы успевают
> помереть до вызова деструктора, а вот если вызывать к
> примеру при нажатии кнопки, прога виснет...

Итак, что мы имеем.
1) у тебя есть многопоточное MFC-приложение
2) в обработчике события нажатия на кнопку ты вызываешь WaitForMultipleObjects с бесконечным таймаутом, ожидая завершения работы потоков.
3) прога виснет.
4) если вызывать ф-ю в деструкторе класса окна, все нормально.

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

рекомендую для того, чтобы сказать потокам о том, что пора закругляться с работой, использовать Event.
пусть они его проверяют, и если он выставлен, завершаются.

PS. MFC не виноват.
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2020 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach