2

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

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

请建议。

4

3 回答 3

3

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

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

//First option
CMyThread* pMyThread = (CMyThread*)AfxBeginThread(RUNTIME_CLASS(CMyThread));

//Second option
CMyThread myThread;
myThread.CreateThread();

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

于 2012-08-27T18:24:08.543 回答
1

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

于 2012-08-27T15:15:18.413 回答
0

您不需要从 CWinThread 派生来存储一些对工作线程私有的更多信息。AfxBeginThread 的 AFX_THREADPROC 函数指针版本采用可用于传递任何内容的 LPVOID 参数。一个简单的字符串,一个充满私有信息的结构,甚至是一个指向调用 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);
}
于 2016-08-31T19:08:50.223 回答