我想知道将CWinThread派生类用作MFC中的工作线程的过程是什么。 msdn文档说CWREEread :: InitInstance()或CWinthread :: Run()只能用于UI线程。
那么有没有办法创建除AfxbeginThread()之外的工作线程?我需要在我的代码中有一个工作线程类,它将存储一些私有的信息,因此希望它来自CWinThread。
请建议。
答案 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);
}