【问题标题】:How to Use CWinThread for making worker thread in MFC?如何使用 CWinThread 在 MFC 中创建工作线程?
【发布时间】:2012-08-25 16:57:55
【问题描述】:

我想知道在 MFC 中使用 CWinThread 派生类作为工作线程的过程是什么。 msdn 文档说 CWinthread::InitInstance() 或 CWinthread::Run() 应该只用于 UI 线程。

那么除了 AfxbeginThread() 之外,还有其他方法可以创建工作线程吗?我需要在我的代码中有一个工作线程类,它将存储一些私有的更多信息,因此希望它从 CWinThread 派生。

请提出建议。

【问题讨论】:

    标签: mfc


    【解决方案1】:

    是的,您可以在不使用 AfxBeginThread 的情况下创建工作线程。

    您可以覆盖虚拟 int Run();函数将您的代码放在那里并在函数末尾调用 ExitInstance() 以结束线程。要启动你的线程,你可以调用 AfxBeginThread,或者简单地调用你的线程对象上的 CreateThead 函数

    //First option
    CMyThread* pMyThread = (CMyThread*)AfxBeginThread(RUNTIME_CLASS(CMyThread));
    
    //Second option
    CMyThread myThread;
    myThread.CreateThread();
    

    也许这不是 MFC 的官方方式,但它确实有效!

    【讨论】:

    • AfxBeginThread 文档说 CRuntimeClass 应该是从 CWinThread 派生的对象的 RUNTIME_CLASS。这似乎是所要求的。
    • 是的,这是我的示例中的第一个选项。
    【解决方案2】:

    文档表明创建“真正的”MFC 工作线程的唯一方法是通过AfxBeginThread()。但是,您可以通过创建派生的 CWinThread 对象、调用它、完成InitInstance() 中的所有工作,然后终止线程来近似工作线程。

    【讨论】:

      【解决方案3】:

      您不需要从 CWinThread 派生来存储一些对工作线程私有的更多信息。 AfxBeginThread 的 AFX_THREADPROC 函数指针版本采用可用于传递任何内容的 LPVOID 参数。一个简单的字符串,一个充满私人信息的结构,甚至是a pointer to the class that called AfxBeginThread(注意同步,不要从工作线程中触摸GUI。)

      // static
      UINT TaskingDialog::Worker(LPVOID p)
      {
          TaskingDialog* self = (TaskingDialog*)p;
          //grab data from self, do work, etc, quick thread
          return 0;
      }
      
      void TaskingDialog::OnStartThread()
      {
          // start a simple worker thread that finishes quickly
          AfxBeginThread(Worker, this);
      }
      

      【讨论】:

      • OP 要求将 CWinThread 派生类作为工作线程。
      • @Goldorak84 是的,但他们给出想要使用它的原因是为了存储重要的私人信息。我认为最好遵循文档而不是从 CWinThread 派生工作线程。
      • documentation 关于工作线程是这样说的:“创建工作线程是一项相对简单的任务。让你的线程运行只需要两个步骤:实现控制功能和启动线程。不必从 CWinThread 派生类。如果需要特殊版本的 CWinThread,可以派生类,但大多数简单的工作线程不需要它。您可以不加修改地使用 CWinThread。"
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 2011-01-01
      • 2014-02-02
      相关资源
      最近更新 更多