Передать более одного аргумента в CreateThread - PullRequest
3 голосов
/ 22 февраля 2009

Вопрос:

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

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

    _COM_SMARTPTR_TYPEDEF(Range, __uuidof(Range));

    RangePtr pRange; //pass pRange

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

Ответы [ 4 ]

13 голосов
/ 22 февраля 2009

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

2 голосов
/ 23 февраля 2009

Вместо создания 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);
    }
};

и инициализировать экземпляр этого функтора по требованию:

int main()
{

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

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

boost :: thread тоже хорошо (но я уже говорил).

-Rick

1 голос
/ 22 февраля 2009

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

0 голосов
/ 23 февраля 2009

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

...