3

问题:

  • 如何将两个参数具体传递给CreateThread

    • 论据一,类型SOCKET
    • 参数二,接口指针

    _COM_SMARTPTR_TYPEDEF(Range, __uuidof(Range));

    RangePtr pRange; //pass pRange

建议:

4

4 回答 4

13

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

于 2009-02-22T20:21:57.933 回答
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 也很好(但我已经说过了)。

-瑞克

于 2009-02-22T22:06:31.927 回答
1

std::pair是你的朋友。

于 2009-02-22T20:26:28.640 回答
0

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

于 2009-02-23T11:14:36.523 回答