将多个参数传递给CreateThread

时间:2009-02-22 20:17:00

标签: c++ windows visual-studio-2008 com marshalling

问题:

  • 如何传递专门两个参数CreateThread

    • 类型SOCKET
    • 的参数一
    • 参数二,界面指针

    _COM_SMARTPTR_TYPEDEF(Range, __uuidof(Range));

    RangePtr pRange; //pass pRange

建议:

4 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分: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();
    }
};

然后,如果我有一个带有两个args的函数:

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

答案 2 :(得分:1)

std::pair是你的朋友。

答案 3 :(得分:0)

您还可以发布WM_COPYDATA,在线程启动后稍后填充COPYDATASTRUCT(参考:http://msdn.microsoft.com/en-us/library/ms649011(VS.85).aspx