Win32,MFC:结束线程

时间:2015-05-26 12:52:45

标签: c++ multithreading winapi mfc

我有一个DLL,它有一个名为CWork的基于CWinThread的类。 我使用AfxBeginThread创建它。

在这个类中,我定义了一个程序,它将循环地循环并执行某个任务。此过程将单独用作线程。我也使用AfxBeginThread创建它。

现在,当我的DLL退出时,我想结束线程。这是因为我在退出时遇到了崩溃,我很担心这就是原因。

此外,还有

伪代码示例:

class Cmain

Cmain::Cmain(){
    pMyThread = AfxBeginThread(CWork - a CWinThread based Class);
}
 UINT HandleNextVTSConnectionCommandProc(LPVOID pParam);

class CWork

 CWork:CWork(){
   AfxBeginThread(HandleNextVTSConnectionCommandProc, this);
 }


UINT HandleNextVTSConnectionCommandProc(LPVOID pParam){

 while(true){

     dosomething();
     sleep(2000);

 }

}

我的问题是,结束这两个线程的正确方法是什么?

谢谢!

4 个答案:

答案 0 :(得分:5)

一般来说,结束线程的正确方法是让它完成,然后等待它完成。因此,在Windows上,您可能会发出一个事件,要求线程完成,然后等待线程HANDLE。强行终止一个线程几乎总是一个被误导的想法,它会再次困扰你。

答案 1 :(得分:4)

创建一个最初未发信号的呼叫CreateEvent的事件。当您的应用程序终止时,发出此事件(SetEvent)的信号并等待线程终止(线程句柄上的WaitForSingleObject)。

在您的线程函数HandleNextVTSConnectionCommandProc中,用

替换while(true)循环
while(WaitForSingleObject(hEvent, 0) != WAIT_OBJECT_0)

执行上述操作后,您可以通知您的应用程序终止线程。当线程从其线程proc。

返回时,该线程终止

答案 2 :(得分:2)

设置一个标志而不是使用while(true)来告诉你的线程何时结束。你也可以使用一个活动。

你应该在退出之前等待你的线程完成,所以你应该使用(在主代码中,一旦你发出线程结束的信号):

WaitForSingleObject(thread_handle)

答案 3 :(得分:1)

这样的事情应该让你开始:

HANDLE g_hThreadExitRequest = NULL;

UINT __cdecl ThreadFunction(LPVOID pParam)
{
    AllocConsole();
    HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);

    for (int i=1; true; ++i)
    {
        CStringA count;
        count.Format("%d\n", i);
        WriteFile(hCon, (LPCSTR)count, count.GetLength(), NULL, NULL);

        if (WaitForSingleObject(g_hThreadExitRequest, 1000) == WAIT_OBJECT_0)
            break;
    }

    // We can do any thread specific cleanup here.
    FreeConsole();

    return 0;
}

void Go()
{
    // Create the event we use the request the thread exit.
    g_hThreadExitRequest = CreateEvent(
                                NULL,   // LPSECURITY_ATTRIBUTES lpEventAttributes
                                TRUE,   // BOOL bManualReset
                                FALSE,  // BOOL bInitialState
                                NULL    // LPCTSTR lpName
                                );

    // We create the thread suspended so we can mess with the returned CWinThread without
    // MFC auto deleting it when the thread finishes.
    CWinThread *pThread = AfxBeginThread(
                                &ThreadFunction,        // AFX_THREADPROC pfnThreadProc
                                NULL,                   // LPVOID pParam
                                THREAD_PRIORITY_NORMAL, // int nPriority
                                0,                      // UINT nStackSize
                                CREATE_SUSPENDED ,      // DWORD dwCreateFlags
                                NULL                    // LPSECURITY_ATTRIBUTES lpSecurityAttrs
                                );

    // Turn off MFC's auto delete "feature".
    pThread->m_bAutoDelete = FALSE;

    // Start the thread running.
    pThread->ResumeThread();

    // Wait 30 seconds.
    Sleep(30*1000);

    // Signal the thread to exit and wait for it to do so.
    SetEvent(g_hThreadExitRequest);
    WaitForSingleObject(pThread->m_hThread, INFINITE);

    // Delete the CWinTread object since we turned off auto delete.
    delete pThread;

    // We're finished with the event.
    CloseHandle(g_hThreadExitRequest);
    g_hThreadExitRequest = NULL;
}