传递多个参数给CreateThread函数

3

问题:

  • 如何在CreateThread中特定地传递两个参数,以便:

    • 第一个参数类型为SOCKET
    • 第二个参数为接口指针

    _COM_SMARTPTR_TYPEDEF(Range, __uuidof(Range));

    RangePtr pRange; //传递pRange

建议:

4个回答

13

创建这两种类型的结构体并传递指向它的指针。这是通过单个指针将数据传递给线程的标准方式。


2

如果可能的话,我首先会使用boost::thread,而不是创建struct_thread_xyz_params。如果这不是一个选项,我会创建一个包装器模板函数对象,在构造时调用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

std::pair 是你的好朋友。


你怎么样将std::pair转换为void*呢? ;) - Artyom
Artyom: std::pair<SOCKET, RangePtr> pr(sock, pRange); void* ptr = (void*)≺ 阿尔秋姆: std::pair<SOCKET,RangePtr> pr(sock,pRange); void *ptr =(void *)&pr; - Peter
@Peter:如果调用函数在线程完成之前超出作用域,可能会导致分段错误。 - Ismael

0

如果您有一些数据需要在创建线程后的某个时间点发送到该线程,请执行以下操作: 1)创建COPYDATASTRUCT结构体 2)使用PostThreadMessage API将WM_COPYDATA消息发布到线程队列中。如有任何疑问,请告知... - atVelu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接