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

Сообщение Re[12]: Как грамотно уничтожить поток в MFC от 28.12.2016 8:55

Изменено 28.12.2016 8:58 Evgeniy Skvortsov

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

RF>То есть код должен иметь примерно такой вид:


Нет. В таком цикле поток будет постоянно съедать процессорное время.
Надо использовать события и ожидать их в потоке через WaitForMultipleObjects

Чисто для примера:
HANDLE hEvents[2];

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    DWORD dwEvent = 0;
    bool bExit = false;
    while (!bExit)
    {
        dwEvent = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);
        switch (dwEvent)
        {
        case WAIT_OBJECT_0:    
            // событие на выход
            bExit = true;
            break;
        case WAIT_OBJECT_0 + 1:    
            //событие надо считать
            // тут идут какие-то расчёты
            break;
        default:
            // что-то пошло не так, выходим
            bExit = true;
        }
    }
    return dwEvent;
}
int main()
{
    hEvents[0] = CreateEvent(NULL, FALSE, FALSE, NULL);        // событие ожидается в потоке когда поток надо завершить
    hEvents[1] = CreateEvent(NULL, FALSE, FALSE, NULL);        // событие ожидается в потоке когда надо просыпаться и что-то считать
    
    DWORD tid = 0;
    CreateThread(NULL, 0, ThreadProc, NULL, 0, &tid);        // создаем рабочий поток
    SetEvent(hEvents[1]);                        // надо считать
    return 0;
}


Вообще, на мой взгляд многопоточность это не та тема, которую можно освоить за 5 минут на форуме. Нужно читать соответствующую литературу.
Re[12]: Как грамотно уничтожить поток в MFC
Здравствуйте, RussianFellow, Вы писали:

RF>То есть код должен иметь примерно такой вид:


Нет. В таком цикле поток будет постоянно съедать процессорное время.
Надо использовать события и ожидать их в потоке через WaitForMultipleObjects

Чисто для примера:
HANDLE hEvents[2];

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
    DWORD dwEvent = 0;
    bool bExit = false;
    while (!bExit)
    {
        dwEvent = WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);
        switch (dwEvent)
        {
        case WAIT_OBJECT_0:    
            // событие на выход
            bExit = true;
            break;
        case WAIT_OBJECT_0 + 1:    
            //событие надо считать
            // тут идут какие-то расчёты
            break;
        default:
            // что-то пошло не так, выходим
            bExit = true;
        }
    }
    return dwEvent;
}
int main()
{
    hEvents[0] = CreateEvent(NULL, FALSE, FALSE, NULL);        // событие ожидается в потоке когда поток надо завершить
    hEvents[1] = CreateEvent(NULL, FALSE, FALSE, NULL);        // событие ожидается в потоке когда надо просыпаться и что-то считать
    
    DWORD tid = 0;
    CreateThread(NULL, 0, ThreadProc, NULL, 0, &tid);        // создаем рабочий поток
    SetEvent(hEvents[1]);                        // надо считать
    return 0;
}


В MFC есть какие-то классы обёртки над всей этой многопоточностью, но я слабо разбирался с MFC реализацией. Надо читать книги по этой библиотеке.

Вообще, на мой взгляд многопоточность это не та тема, которую можно освоить за 5 минут на форуме. Нужно читать соответствующую литературу.