2009-02-22 3 views
3

Вопрос:Pass более чем один аргумент CreateThread

  • Как проход специально два аргументы CreateThread, когда:

    • Аргумент один, типа SOCKET
    • Аргумент два, указатель интерфейса :

    _COM_SMARTPTR_TYPEDEF(Range, __uuidof(Range));

    RangePtr pRange; //pass pRange

Предложения:

ответ

13

создать структуру этих двух типов и передать указатель на нее. Это стандартный способ передачи данных в потоки по одному указателю.

+0

обычно знаем, как структура thread_xyz_params ;-) – EricSchaefer

+0

@Artyom: Спасибо :) – Aaron

1

std::pair - твой друг.

+0

Интересно, никогда не слышал об этом ... – Aaron

+0

как бы вы могли бы преобразовать std :: pair в void *;) – Artyom

+0

Artyom: std :: pair pr (sock, pRange); void * ptr = (void *) ≺ – Peter

2

Вместо того чтобы создавать struct_thread_xyz_params, я бы сначала использовал boost :: thread, если это возможно. Если это не вариант, я бы создать шаблон обертки объект функции, который вызывает CreateThread с самими собой, когда он построен:

template <class Func> 
class Thread 
{ 
    Func m_Func; 
    static DWORD WINAPI ThreadFunc(void* param) 
    { 
     Thread& pFunc = *(Thread*)param; 
     pFunc(); 
     return S_OK; 
    } 
public: 
    Thread(Func& func): m_Func(func){ 
     CreateThread(NULL,NULL,Thread::ThreadFunc,this,NULL,NULL); 
    }; 
    void operator()() 
    { 
     m_Func(); 
    } 
}; 

тогда, если я имел функцию, которая приняла два аргумента:

void printTwoStrings(string a, string b) 
{ 
    cout << a << " " << b << endl; 
}; 

Я мог бы обернуть их в функторе:

class StringFunc 
{ 
    string m_a; 
    string m_b; 
public: 
    StringFunc(string a, string b):m_a(a),m_b(b) 
    { 

    }; 
    void operator()(){ 
     printTwoStrings(m_a,m_b); 
    } 
}; 

и initiliaze экземпляра этого функтора по запросу:

int main() 
{ 

    Thread<StringFunc> myThread(StringFunc("hello","world")); 
    Sleep(500); 
    return 0; 
} 

Обратите внимание, что я сплю в конце, вы ничего не сказали о ожидании завершения потока ... Трудность с struct_xyz_params заключается в том, что вам часто понадобится позже struct_wxyz_params и соблазн дублировать код всегда высок ...

boost :: thread is good too (но я уже сказал это).

-Rick

0

вы также можете оставить WM_COPYDATA, заполняя COPYDATASTRUCT на более позднем этапе после того, как поток запускается (реф: http://msdn.microsoft.com/en-us/library/ms649011(VS.85).aspx)

+0

@Velusbits: вы можете объяснить? Извините ... – Aaron

+0

Если у вас есть данные, которые будут отправлены в ваш поток позже, после создания 1) создайте COPYDATASTRUCT 2) Отправьте сообщение WM_COPYDATA в очередь потоков с помощью PostThreadMessage API. Сообщите мне о любом ... – atVelu

Смежные вопросы