Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TThread: WaitForMultipleObjects, дождаться завершения потоков 
V
    Опции темы
Alca
Дата 30.3.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 25
Всего: 50



TThread: WaitForMultipleObjects, дождаться завершения потоков.
Код

//---------------------------------------------------------------------------
class CMainThread: public TThread {
    public:
        std::vector<CSubThread *> m_vecpSubThread; 

};
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
void __fastcall CMainThread::Execute() {
    do {
        //...
        //-------------------------------------
        //заускаем поток
        m_vecpSubThread.push_back(new CSubThread(m_iThreadIndex, true));
        m_vecpSubThread[m_iThreadIndex]->FreeOnTerminate = true;    //!!!!!!!1
        m_vecpSubThread[m_iThreadIndex]->OnTerminate     = vDoneSubThread;
        m_vecpSubThread[m_iThreadIndex]->Resume();

        m_iThreadIndex    ++;
        //...
    } while (true);        
    
    
    //-------------------------------------
    //ждем пока завершаться дочерние потоки
    THandle hHandles[8] = {0};
    for (int i = 0; i < 8; i ++) {
        hHandles[i] = m_vecpSubThread[i]->Handle;
    }

    DWORD dwRes = ::WaitForMultipleObjects(8, &hHandles, TRUE, INFINITE);    //<<<< ругаеться сюда
    /*DEBUG*/assert(WAIT_OBJECT_0 == dwRes);  
}    
//---------------------------------------------------------------------------

Ругань:
Код

[C++ Error] uCMainThread.cpp(107): E2034 Cannot convert 'unsigned int ( *)[8]' to 'void * const *'
[C++ Error] uCMainThread.cpp(107): E2342 Type mismatch in parameter 'lpHandles' (wanted 'void * const *', got 'unsigned int ( *)[8]')

Если так:
Код

    /*THandle*/HANDLE hHandles[8] = {0};
    for (int i = 0; i < 8; i ++) {
        hHandles[i] = (HANDLE)m_vecpSubThread[i]->Handle;
    }

то выскакивает эссерт.
Код

---------------------------
Project1
---------------------------
Assertion failed.

Program: D:\...\Project1.exe
File: D:\...\uCMainThread.cpp
Line: 129
Function: CMainThread::Execute
Expression: false
GetLastError(): Неверный дескриптор.

Comment: 
---------------------------
Прервать   Повтор   Пропустить   
---------------------------




Это сообщение отредактировал(а) Alca - 30.3.2009, 12:29


--------------------
PM WWW ICQ Skype Jabber   Вверх
xvr
Дата 30.3.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Это
Код

        m_vecpSubThread[m_iThreadIndex]->FreeOnTerminate = true;    //!!!!!!!1
и это
Код

        hHandles[i] = m_vecpSubThread[i]->Handle;
несовместимо - поток при своем окончании удалит объект в m_vecpSubThread, что автоматом сделает невозможным добраться до потрохов удаленного объекта (что бы прочесть Handle), да собственно и сам Handle при этом закроется.

PM MAIL   Вверх
Alca
Дата 30.3.2009, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 25
Всего: 50



Это точно.   smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 30.3.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 25
Всего: 50



Сделал:
Код

FreeOnTerminate = false;
//....
DWORD dwRes = ::WaitForMultipleObjects(8, hHandles, TRUE, INFINITE);
switch (dwRes) {
    case (WAIT_OBJECT_0 + 0):
        break;

    case (WAIT_OBJECT_0 + 1):
        Application->ProcessMessages();
        break;
        
    case WAIT_TIMEOUT:
        assert(false);
        break;

    case WAIT_ABANDONED:
        assert(false);
        break;

    case WAIT_FAILED:
        assert(false);    //<<<< сюда валиться
        break;
}

Всё равно валиться...  smile 

Это сообщение отредактировал(а) Alca - 30.3.2009, 13:55


--------------------
PM WWW ICQ Skype Jabber   Вверх
Alca
Дата 30.3.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 25
Всего: 50



Оказывается, что WaitForMultipleObjects больше чем MAXIMUM_WAIT_OBJECTS хендлов не тянет (я таки передавал больше).
На WinXP SP3 MAXIMUM_WAIT_OBJECTS равно 64.
Код

Код

DWORD WINAPI WaitForMultipleObjects(
  __in  DWORD nCount,
  __in  const HANDLE *lpHandles,
  __in  BOOL bWaitAll,
  __in  DWORD dwMilliseconds
);

Parameters
nCount [in] 

The number of object handles in the array pointed to by lpHandles. The maximum number of object handles is MAXIMUM_WAIT_OBJECTS.
...
To wait on more than MAXIMUM_WAIT_OBJECTS handles, use one of the following methods:
Create a thread to wait on MAXIMUM_WAIT_OBJECTS handles, then wait on that thread plus the other handles. Use this technique to break the handles into groups of MAXIMUM_WAIT_OBJECTS.
Call RegisterWaitForSingleObject to wait on each handle. A wait thread from the thread pool waits on MAXIMUM_WAIT_OBJECTS registered objects and assigns a worker thread after the object is signaled



--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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