如何使用CWinThread在MFC中创建工作线程?

时间:2012-08-25 16:57:55

标签: mfc

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

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

请建议。

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:-1)

您不需要从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);
}