【问题标题】:Pass more than one argument to CreateThread将多个参数传递给 CreateThread
【发布时间】:2010-10-09 05:00:52
【问题描述】:

问题:

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

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

    _COM_SMARTPTR_TYPEDEF(Range, __uuidof(Range));

    RangePtr pRange; //pass pRange

建议:

【问题讨论】:

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


    【解决方案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();
          }
      };
      

      如果我有一个需要两个参数的函数:

      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 也不错(但我已经说过了)。

      -瑞克

      【讨论】:

        【解决方案3】:

        std::pair 是你的朋友。

        【讨论】:

        • 如何将 std::pair 转换为 void* ;)
        • Artyom: std::pair pr(sock, pRange); void* ptr = (void*)&pr;
        • @Peter:如果调用函数在线程完成之前超出范围,您可能会以分段错误结束。
        【解决方案4】:

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

        【讨论】:

        • 如果您在创建后有一些数据要稍后发送到您的线程 1) 创建 COPYDATASTRUCT 2) 使用 PostThreadMessage API 将 WM_COPYDATA 消息发布到线程队列。让我知道任何...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-18
        • 2013-01-07
        • 2011-10-10
        • 2013-09-15
        • 2012-09-05
        • 2017-06-14
        • 2018-08-12
        相关资源
        最近更新 更多