我想知道在 MFC 中使用 CWinThread 派生类作为工作线程的过程是什么。msdn 文档说 CWinthread::InitInstance() 或 CWinthread::Run() 应该只用于 UI 线程。
那么除了 AfxbeginThread() 之外有没有办法创建工作线程呢?我需要在我的代码中有一个工作线程类,它将存储一些私有的更多信息,因此希望它从 CWinThread 派生。
请建议。
我想知道在 MFC 中使用 CWinThread 派生类作为工作线程的过程是什么。msdn 文档说 CWinthread::InitInstance() 或 CWinthread::Run() 应该只用于 UI 线程。
那么除了 AfxbeginThread() 之外有没有办法创建工作线程呢?我需要在我的代码中有一个工作线程类,它将存储一些私有的更多信息,因此希望它从 CWinThread 派生。
请建议。
是的,您可以在不使用 AfxBeginThread 的情况下创建工作线程。
您可以覆盖虚拟 int Run(); 函数将您的代码放在那里并在函数末尾调用 ExitInstance() 以结束线程。要启动你的线程,你可以调用 AfxBeginThread,或者简单地调用你的线程对象上的 CreateThead 函数
//First option
CMyThread* pMyThread = (CMyThread*)AfxBeginThread(RUNTIME_CLASS(CMyThread));
//Second option
CMyThread myThread;
myThread.CreateThread();
也许这不是 MFC 的官方方式,但它确实有效!
文档表明创建“真正的”MFC 工作线程的唯一方法是通过AfxBeginThread()
. 但是,您可以通过创建派生的 CWinThread 对象、调用它、完成所有工作InitInstance()
、然后终止线程来近似工作线程。
您不需要从 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);
}