Информация об изменениях

Сообщение Re: Cwinthread от 10.04.2015 8:38

Изменено 10.04.2015 9:41 Evgeniy Skvortsov

Здравствуйте, ahaos, Вы писали:

Предлагаю создавать рабочие потоки напрямую через CreateThread или (_beginthread). В данном случае mfc-ые потоки не нужны.

А вообще странно что delete pwth[i] выдает ошибку. Кстати что за ошибка ?
Может оператор [] в самопальном массиве как-то криво реализован?

И кстати в цикле не нужны вызовы TerminateThread() и CloseHandle(). Первый — потому что поток уже завершился, второй — потому что CloseHandle вызывается в деструкторе CWinThread
Здравствуйте, ahaos, Вы писали:

Предлагаю создавать рабочие потоки напрямую через 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);


Все указатели тут удалятся автоматически.