3

質問:

  • 次の場合に、具体的に2 つの引数をCreateThread渡す方法:

    • タイプの引数 1SOCKET
    • 引数 2、インターフェイス ポインター:

    _COM_SMARTPTR_TYPEDEF(Range, __uuidof(Range));

    RangePtr pRange; //pass pRange

提案:

4

4 に答える 4

13

これら 2 つのタイプの構造体を作成し、その構造体へのポインターを渡します。これは、単一ポインターを介してスレッドにデータを渡す標準的な方法です。

于 2009-02-22T20:21:57.933 に答える
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();
    }
};

次に、2 つの引数を取る関数があるとします。

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;
}

私は最後に眠っていることに注意してください.スレッドが完了するのを待つことについてあなたは何も言わなかった. ..

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 に答える