Использование массивов для циклического запуска нескольких потоков, передачи разных параметров и дескрипторов возврата для WaitForMultipleObjects - PullRequest
0 голосов
/ 12 мая 2011

Я хочу протестировать, используя WaitForMultipleObjects, и для этого я хочу запустить несколько потоков, используя цикл, каждый из которых передает разные ThreadArgs.

(По сути, это просто массив из пяти ThreadArgs и пяти HANDLEs?)

Когда я пытаюсь создать массив либо из структуры, либо из HANDLE, ни то, ни другое не сработает, и я получаю сообщение об ошибке «не могу выделить массив постоянного размера 0» для обоих и «инициализировать»: невозможно преобразовать из « РУЧКА "на" РУЧКА [] "для последнего.

Является ли массив подходящим способом сделать это в отношении структуры? (Кроме того, примечание - оно должно остаться структурой, так как в конечном итоге оно будет содержать шесть членов, сначала я просто пытаюсь заставить его работать в более простой форме, поскольку добавление этих членов должно быть очень простым)

И я бы предположил, что массив Handles - лучший способ сделать это, но как мне объявить один?

Спасибо!

#include <windows.h>
#include <iostream> 
#include <process.h>


struct ThreadArgs 
{
    int id;
};

ThreadArgs args = {1}; 


unsigned int __stdcall MyThread(void *data)
{
    std::cout << "Hello World!\n"; 
    ThreadArgs *args = (ThreadArgs *) data; 

    std::cout << (*args).id;

    return 2;
}

int main()
{

    HANDLE hThread = (HANDLE) _beginthreadex(NULL, 0, MyThread, &args, 0, NULL); 

    WaitForSingleObject(hThread, INFINITE);


    while(true);

}

Выше мой код в настоящее время.

Я пытался создать массив HANDLE, используя -

HANDLE hThread[5]; 

Edit:

Ошибка в этой строке, когда она изменяется на массив HANDLE [5] -

HANDLE hThread[0] = (HANDLE) _beginthreadex(NULL, 0, MyThread, &args, 0, NULL); 

1 Ответ

1 голос
/ 12 мая 2011

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

#include <windows.h>
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;

CRITICAL_SECTION cs;

struct ThreadArgs 
{
    int id;
};

VOID MyThread(void *data)
{
    EnterCriticalSection(&cs);
    ThreadArgs *args = (ThreadArgs*)data;
    cout << args->id << endl;
    LeaveCriticalSection(&cs);
}

int main()
{
    InitializeCriticalSection(&cs);

    vector <HANDLE> T;

    DWORD id;

    ThreadArgs args[5] = {1, 2, 3, 4, 5};

    for (int i = 0; i < 5; i++)
    {
        T.push_back(CreateThread(0, 0, (LPTHREAD_START_ROUTINE)MyThread, &args[i], 0, &id));
    }

    WaitForMultipleObjects(5, &T[0], TRUE, INFINITE);

    DeleteCriticalSection(&cs);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...