Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему зависает выполнение? 
V
    Опции темы
xTr1m
Дата 21.3.2011, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Доброго времени суток. Есть код (запускается два потока и ожидается их выполнение) :

Код

const int size = 800;

UINT Func1( LPVOID pParam )
{
    for(int i=0; i<size; ++i)
    {
        for(int j=0; j<size; ++j)
        {
            for(int m=0; m<size; ++m)
            {
                int h = 0;
            }
        }
    }
    
    //AfxMessageBox("Complete 1");
    return 0;
}

UINT Func2( LPVOID pParam )
{
    for(int i=0; i<size; ++i)
    {
        for(int j=0; j<size; ++j)
        {
            for(int m=0; m<size; ++m)
            {
                int h = 0;
            }
        }
    }
    
    //AfxMessageBox("Complete 2");
    return 0;
}

void CmultiprocDlg::OnBnClickedButton1()
{
    CWinThread *pThread1 = AfxBeginThread(Func1, this);
    CWinThread *pThread2 = AfxBeginThread(Func2, this);

    HANDLE arr[2];
    arr[0] = pThread1->m_hThread;
    arr[1] = pThread2->m_hThread;

    WaitForMultipleObjects(2, &arr[0], true, INFINITE);        
    AfxMessageBox(_T("finished"));
}


Этот код работает. Но если раскомментировать строки с AfxMessageBox, то все зависает. То есть, когда доходит до сообщения в первом потоке (ставлю там breakpoint), дальше жму F10 и все наглухо повисает. В чем проблема? AfxMessageBox какой то потокобезопасный и чего то ждет? Спасибо.
PM MAIL WWW ICQ   Вверх
Albor
Дата 22.3.2011, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Осмелюсь предположить, что MessageBox появляется, но невидим, а, поскольку это модальное окно, создаётся эффект зависания.
PM MAIL ICQ   Вверх
xTr1m
Дата 22.3.2011, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Штука получается такая, что если убрать WaitForMultipleObjects, то сообщения появляются.
PM MAIL WWW ICQ   Вверх
Albor
Дата 22.3.2011, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Эта строчка ожидает сигналы от обоих потоков бесконечно, а чтобы функция потока завершилась, нужно завершить работу MessageBox-a. 

Это сообщение отредактировал(а) Albor - 22.3.2011, 10:38
PM MAIL ICQ   Вверх
xTr1m
Дата 22.3.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Ага, ну примерно стало ясно. Неясно другое - почему messagebox не отображается =)
PM MAIL WWW ICQ   Вверх
Albor
Дата 22.3.2011, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Вот из MSDN
Цитата

Use caution when calling the wait functions and code that directly or indirectly creates windows. If a thread creates any windows, it must process messages. Message broadcasts are sent to all windows in the system. A thread that uses a wait function with no time-out interval may cause the system to become deadlocked. Two examples of code that indirectly creates windows are DDE and the CoInitialize function. Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than WaitForMultipleObjects.

То есть нужно использовать MsgWaitForMultipleObjects или MsgWaitForMultipleObjectsEx, так как функция потока создаёт окно.
PM MAIL ICQ   Вверх
xTr1m
Дата 22.3.2011, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Вау, огромное спасибо. Даже не знаю как вы это нашли =)
PM MAIL WWW ICQ   Вверх
Albor
Дата 22.3.2011, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(xTr1m @  22.3.2011,  12:30 Найти цитируемый пост)
 Даже не знаю как вы это нашли =) 

Да это не мудрено. В описании функций есть ремарки, там это и описывается.
PM MAIL ICQ   Вверх
Dem_max
Дата 23.3.2011, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 1
Всего: 39



нельзя MessageBox вызывать в потоке, их нужно вызывать в основном потоке обработки сообщений путем. 


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0724 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.