Как передать данные в разные потоки - PullRequest
1 голос
/ 24 августа 2011

Предположим, если я создаю 5 потоков через CreateThread().Мне нужно будет передать целые числа 1, 2, 3, 4, 5 каждому потоку, но я также должен передать указатель this.Также я не могу передать более одного аргумента, потому что функция CreateThread принимает только один, и я не могу создать переменную-член в классе, потому что она будет разделена между потоками.Как это сделать и сколько данных может иметь стек потоков?

Ответы [ 2 ]

4 голосов
/ 24 августа 2011

Определите структуру и передайте объект этой структуры.

Структура может быть такой:

struct ThreadContext
{
     MyClass *m_this;
     int      m_int;
     //add more members you need to pass more data
};

Тогда вы можете сделать это:

for ( int i = 0 ; i < 5 ; i++ )
{
   ThreadContext *ctx = new ThreadContext();
   ctx->m_this = this;
   ctx->m_int = i ;
   CreateThread(...., ThreadProc, ctx, ...);
}

Убедитесь, что объект, который вы передаете каждому потоку, является другим объектом. Вот почему я использовал new и создал объект для каждого потока. А затем внутри ThreadFunc используйте static_cast как:

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
     ThreadContext *ctx = static_cast<ThreadContext*>(lpParameter);
     //use ctx

     //...

     //at the end of the thread, deallocate the memory!
     delete ctx; 
}

Или, в качестве альтернативы, вы можете сохранить std::vector<ThreadContext> в качестве данных элемента MyClass.

1 голос
/ 24 августа 2011

Может быть, создать новую структуру, содержащую указатель this и целое число, и передать его потоку, извлекая это содержимое соответствующим образом в функцию, выполняемую потоком?

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