代码之家  ›  专栏  ›  技术社区  ›  Aaron

向CreateThread传递多个参数

  •  3
  • Aaron  · 技术社区  · 16 年前

    问题:

    • 如何 通过 明确地 论据 CreateThread , 什么时候? :

      • 参数1,类型为 SOCKET
      • 第二个论点,一个 接口指针 :

      _COM_SMARTPTR_TYPEDEF(Range, __uuidof(Range));

      RangePtr pRange; //pass pRange

    建议:

    4 回复  |  直到 16 年前
        1
  •  13
  •   Artyom    16 年前

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

        2
  •  2
  •   Rick    16 年前

    如果可能的话,我将首先使用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-xyz-params,并且重复代码的诱惑总是很高的…

    线程也很好(但我已经说过了)。

    -里克

        3
  •  1
  •   Motti    16 年前

    std::pair 是你的朋友。

        4
  •  0
  •   atVelu    16 年前

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