информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetSpanning Tree Protocol: недокументированное применениеГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[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-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach