Ожидание выполнения потока Winapi

297
06 июня 2017, 00:33

Подскажите, почему выполняется только первый поток? Как можно исправить, что бы выполнялись потоки по очереди?

#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <windows.h>
using namespace std;
struct ARGS {
    int a;
    int b;
};
DWORD WINAPI ThreadFunctionOne(LPVOID pArgs_)
{
    ARGS *pArgs = (ARGS*)pArgs_;
    int s = 0;
    while (pArgs->a <= pArgs->b) s += pArgs->b--;
    cout << "Сумма равна = " << s << endl;
    return 0;
}
DWORD WINAPI ThreadFunctionTwo(LPVOID pArgs_)
{
    ARGS *pArgs = (ARGS*)pArgs_;
    int p = 1;
    while (pArgs->a <= pArgs->b) p *= pArgs->b--;
    cout << "Произведение равно = " << p << endl;
    return 0;
}
int main()
{
    setlocale(0, "");
    int a, b;
    cout << "Введите нижнюю границу диапазона L: ";
    cin >> a;
    cout << "Введите верхнюю границу диапазона U: ";
    cin >> b;
    ARGS args = { a, b };
    DWORD idThread;
    HANDLE h1, h2;
    // Создается два потока в приостановленном состоянии
    h1 = CreateThread(NULL, 0, ThreadFunctionOne, &args, CREATE_SUSPENDED, &idThread);
    h2 = CreateThread(NULL, 0, ThreadFunctionTwo, &args, CREATE_SUSPENDED, &idThread);
    ResumeThread(h1);
    WaitForSingleObject(h1, 1000);
    ResumeThread(h2);
    _getch();
    return 0;
}
Answer 1

Потоки выполняются по очереди как минимум потому, что у Вас стоит вызов WaitForSingleObject, который не завершится, пока не завершится поток h1.

Самый простой вариант решить проблему - отпустить оба потока через ResumeThread и вызвать WaitForMultipleObjects для обоих этих потоков с поднятым флагом bWaitAll

    ...
    HANDLE h[2];
    // Создается два потока в приостановленном состоянии
    h[0] = CreateThread(NULL, 0, ThreadFunctionOne, &args, CREATE_SUSPENDED, &idThread);
    h[1] = CreateThread(NULL, 0, ThreadFunctionTwo, &args, CREATE_SUSPENDED, &idThread);
    ResumeThread(h[0]);
    ResumeThread(h[1]);
    WaitForMultipleObjects(2, h, TRUE, 1000);
    ...
READ ALSO
Что значит конструкция if (mas[i] - !!a != a[i])

Что значит конструкция if (mas[i] - !!a != a[i])

Недавно начал изучать C++, столкнулся со странной конструкцией условного оператора и не могу понять что он с чем сравнивает

381
Получить данные с модального окна

Получить данные с модального окна

У меня есть класс основного окна MainWindowС него я запускаю (допустим, при авторизации) модальное окно авторизации с полями "Логин", "Пароль" (lineLogin,...

258
Взятие объекта по адресу в конструторе копирования

Взятие объекта по адресу в конструторе копирования

Всем добрый деньСтандартный конструктор копирования в классе выглядит так: SomeClass(const SomeClass &obj) Как я понимаю, const отвечают за то, что в процессе...

260