Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Mdi пРИЛОЖЕНИЕ, пОТОК пОДГОТАВЛИВАЮЩИЙ дАННЫЕ дЛЯ дОКУМЕНТА и зАКРЫТИЕ дОКУМЕНТА

1.9K
19 ноября 2003 года
SvN
28 / / 11.07.2003
Есть MDI приложение. У каждого документа присутствует поток который постоянно подготавливает для него данные. При завершении подготовки он через посылку главному окну сообщения говорит документу что "готовы новые данные" и документ чето с ними делает.

CCriticalSection cs;

UINT SomeThread(LPVOID param)
{
.....
cs.Lock(); // без этого похоже происходит переполнение очереди сообщений если открыто много документов
while ( 0 ==
::SendMessageTimeout(AfxGetMainWnd()->GetSafeHwnd(),WM_MY_CUSTOM_MESSAGE,WPARAM(pDoc),0,SMTO_ABORTIFHUNG|SMTO_BLOCK, 1000,0 ) )
)
{
// проверка на завершение работы потока в случае закрытия документа (cs.UnLock(); return 0) иначе продолжение цикла(пытаемся отослать опять)
}
cs.UnLock();
.....
return 0;
}

LRESULT CMainFrame::OnSomeMessHandler(UINT wParam, LONG lParam)
{
CMyDoc* pDoc = (CMyDoc*)wParam;
pDoc->OnNewDataReady();
return 0;
}

Все работает, НО проблема в том что при закрытии документа(одного из многих и не каждый раз!) приложение зависает. т.е. поток не может дождаться отправки сообщения и крутится в цикле отправки(причем хендл окна не меняется), а окно не принимает никакого сообщения(игнорирует все). Такое впечатление что оно ждет определенного(хотя не понятно почему не может дождаться потоки то разные) и отказывается принимать остальные. Самое интересное то что без критической секции все почти работает(по крайней мере не виснет), но похоже происходит переполнение очереди сообщений так как некоторые окна(к которым давно обращались перестают перерисовываться и приложение не реагирует на другие события как клик мыши например)
В чем дело, че делать?
Заранее благодарен за оказанное внимание и напряг мозгов.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог