Сообщение Re: Cwinthread от 10.04.2015 8:38
Изменено 10.04.2015 9:51 Evgeniy Skvortsov
Здравствуйте, ahaos, Вы писали:
Предлагаю создавать рабочие потоки напрямую через CreateThread или (_beginthread). В данном случае mfc-ые потоки не нужны.
А вообще странно что delete pwth[i] выдает ошибку. Кстати что за ошибка ?
Может оператор [] в самопальном массиве как-то криво реализован?
И кстати в цикле не нужны вызовы TerminateThread() и CloseHandle(). Первый — потому что поток уже завершился, второй — потому что CloseHandle вызывается в деструкторе CWinThread
А вообще можно сократить твой код до примерно такого:
Все указатели тут удалятся автоматически.
Предлагаю создавать рабочие потоки напрямую через CreateThread или (_beginthread). В данном случае mfc-ые потоки не нужны.
А вообще странно что delete pwth[i] выдает ошибку. Кстати что за ошибка ?
Может оператор [] в самопальном массиве как-то криво реализован?
И кстати в цикле не нужны вызовы TerminateThread() и CloseHandle(). Первый — потому что поток уже завершился, второй — потому что CloseHandle вызывается в деструкторе CWinThread
А вообще можно сократить твой код до примерно такого:
std::vector<std::unique_ptr<CWinThread*>> pwth;
std::vector<HANDLE> hnd;
for (size_t i = 0; i <= GetCPUNumber; ++i) {
CWinThread *pthread = AfxBeginThread(proc, NULL, THREAD_PRIORITY_BELOW_NORMAL, NULL, CREATE_SUSPENDED);
if (!pthread) {
AfxMessageBox(_T("Ошибка создания потока расчета"));
return;
}
pthread->m_bAutoDelete = false;
pwth.push_back(std::make_unique<CWinThread*>(pthread));
hnd.push_back(pthread->m_hThread);
pthread->ResumeThread();
}
WaitForMultipleObjects(GetCPUNumber, &hnd[0], true, INFINITE);
Все указатели тут удалятся автоматически.
Re: Cwinthread
Здравствуйте, ahaos, Вы писали:
Предлагаю создавать рабочие потоки напрямую через CreateThread или (_beginthread). В данном случае mfc-ые потоки не нужны.
А вообще странно что delete pwth[i] выдает ошибку. Кстати что за ошибка ?
Может оператор [] в самопальном массиве как-то криво реализован?
И кстати в цикле не нужны вызовы TerminateThread() и CloseHandle(). Первый — потому что поток уже завершился, второй — потому что CloseHandle вызывается в деструкторе CWinThread
А вообще можно сократить твой код до примерно такого:
Предлагаю создавать рабочие потоки напрямую через CreateThread или (_beginthread). В данном случае mfc-ые потоки не нужны.
А вообще странно что delete pwth[i] выдает ошибку. Кстати что за ошибка ?
Может оператор [] в самопальном массиве как-то криво реализован?
И кстати в цикле не нужны вызовы TerminateThread() и CloseHandle(). Первый — потому что поток уже завершился, второй — потому что CloseHandle вызывается в деструкторе CWinThread
А вообще можно сократить твой код до примерно такого:
// Вектор не из голых указателей, а из смарт. Когда сам вектор будет уничтожен - он автоматом вызовет delete для указателей
std::vector<std::unique_ptr<CWinThread*>> pwth;
// вектор гарантирует что все элементы будут лежать в памяти в одном непрерывном куске памяти
// так что создавать третий массив для WaitForMultipleObjects не требуется.
std::vector<HANDLE> hnd;
for (size_t i = 0; i <= GetCPUNumber; ++i) {
CWinThread *pthread = AfxBeginThread(proc, NULL, THREAD_PRIORITY_BELOW_NORMAL, NULL, CREATE_SUSPENDED);
if (!pthread) {
AfxMessageBox(_T("Ошибка создания потока расчета"));
return;
}
pthread->m_bAutoDelete = false;
pwth.push_back(std::make_unique<CWinThread*>(pthread));
hnd.push_back(pthread->m_hThread);
pthread->ResumeThread();
}
WaitForMultipleObjects(GetCPUNumber, &hnd[0], true, INFINITE);