如何使用CWinThread在MFC中生成工作线程?

如何使用CWinThread在MFC中生成工作线程?,mfc,Mfc,我想知道在MFC中将CWinThread派生类用作工作线程的过程是什么。 msdn文档说明CWinthread::InitInstance()或CWinthread::Run()应仅用于UI线程 那么,除了AfxbeginThread()之外,还有其他方法可以创建工作线程吗?我需要在我的代码中有一个worker-thread类,该类将存储更多的私有信息,因此希望从CWinThread派生它 请建议。文档指出,创建“真正”MFC工作线程的唯一方法是通过AfxBeginThread()。但是,您可以

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

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


请建议。

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

是的,您可以创建工作线程,而无需使用AfxBeginThread

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

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

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

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

不需要从CWinThread派生来存储工作线程专用的更多信息。AfxBeginThread的AFX_THREADPROC函数指针版本采用LPVOID参数,可用于传入任何内容。一个简单的字符串,一个充满私有信息的结构,甚至(只是要注意同步,不要从工作线程接触GUI)


文档说CRuntimeClass应该是从CWinThread派生的对象的运行时类。这似乎是要求的。是的,这是我的示例中的第一个选项。OP要求将CWinThread派生类作为工作线程。@Goldorak84是的,但他们给出的使用它的原因是为了存储重要的私有信息。我认为最好遵循文档,而不是从工作线程的CWinThread派生。下面是关于工作线程的说明:“创建辅助线程是一项相对简单的任务。运行线程只需要两个步骤:实现控制函数和启动线程。不必从CWinThread派生类。如果需要CWinThread的特殊版本,可以派生一个类,但大多数简单工作线程都不需要它。您可以使用CWinThread而无需修改。“
// 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);
}