Re: Cwinthread
От: Evgeniy Skvortsov Россия  
Дата: 10.04.15 08:38
Оценка:
Здравствуйте, ahaos, Вы писали:

Предлагаю создавать рабочие потоки напрямую через 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);
Отредактировано 10.04.2015 9:51 Evgeniy Skvortsov . Предыдущая версия . Еще …
Отредактировано 10.04.2015 9:41 Evgeniy Skvortsov . Предыдущая версия .
Отредактировано 10.04.2015 8:55 Evgeniy Skvortsov . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.