删除线程时崩溃

杰尼杰克

我正在使用MFC开发应用程序。UI线程启动工作线程,并在应用程序关闭时将其停止。问题在于,每次尝试删除线程时,应用程序都会崩溃。

这是代码:

首先是线程类及其实现:

class FileThread : public CWinThread
{
public:
    static FileThread* CreateWorkerThread(LPVOID params, UINT priority, UINT flags);

    void InitThread();
    void StopThread();
    inline HANDLE GetStopHandle() const { return m_stopThread; }
    inline HANDLE GetWaitHandle() const { return m_waitThread; }

private:
    HANDLE m_stopThread;
    HANDLE m_waitThread;

    FileThread(): m_stopThread(NULL), m_waitThread(NULL) { }

    static UINT MyThreadProc(LPVOID pParam);
};

FileThread* FileThread::CreateWorkerThread(LPVOID params, UINT priority, UINT flags)
{
    return (FileThread*) AfxBeginThread(FileThread::MyThreadProc, params, priority, 0,  flags);
}

void FileThread::InitThread()
{
    m_stopThread = CreateEvent(0, TRUE, FALSE, 0);
    m_waitThread = CreateEvent(0, TRUE, FALSE, 0);
}

void FileThread::StopThread()
{
    ::SetEvent(m_stopThread);
    ::WaitForSingleObject(m_waitThread, INFINITE);
    ::CloseHandle(m_stopThread);
    ::CloseHandle(m_waitThread);
}


UINT FileThread::MyThreadProc(LPVOID pParam)
{
    ThreadData* pLink = (ThreadData*)pParam;
    BOOL continueProcess = TRUE;
    int returnCode = EXITCODE_SUCCESS;

    while (continueProcess)
    {
        if(::WaitForSingleObject(pLink->pMe->GetStopHandle(), 0) == WAIT_OBJECT_0)
        {
            ::SetEvent(pLink->pMe->GetWaitHandle());
            continueProcess = FALSE;
        }

        // the thread is looking for some files...
    }

    delete pLink; // it was allocated from the UI thread

    return returnCode;
}

然后,在我启动线程的地方:

ThreadData * td = new ThreadData();

m_myFileThread = FileThread::CreateWorkerThread((LPVOID)td, THREAD_PRIORITY_LOWEST, CREATE_SUSPENDED);

td->pMe = m_myFileThread;
m_myFileThread->m_bAutoDelete = FALSE;

m_myFileThread->InitThread();
m_myFileThread->ResumeThread();

最后,停止(以及崩溃):

DWORD exitCode;
if (m_myFileThread != NULL && GetExitCodeThread(m_myFileThread->m_hThread, &exitCode) && (exitCode == STILL_ACTIVE))
    {
        m_myFileThread->StopThread();
        if(::WaitForSingleObject(m_myFileThread->m_hThread, 5000) == WAIT_TIMEOUT)
        {
            TerminateThread(m_myFileThread->m_hThread, EXITCODE_ABORT);
        }
    }

if (m_myFileThread != NULL)
{ 
    delete m_myFileThread; // => CRASH
}

看来我尝试删除已删除的内容并最终导致堆损坏。我尝试将m_bAutoDelete设置为TRUE,而不是自己删除线程,因为我遇到了相同的崩溃(该程序试图调用AfxEndThread时)。

线程终止其线程proc并返回退出代码。

罗杰·罗兰德

在我看来,这里有一个问题:

FileThread* FileThread::CreateWorkerThread(LPVOID params, UINT priority, 
                                           UINT flags)
{
    return (FileThread*) AfxBeginThread(FileThread::MyThreadProc, params, 
                                        priority, 0,  flags);
}

AfxBeginThread返回一个CWinthread*,因此仅将其强制转换为您自己的派生类并不能使其成为该派生类的实例。我很惊讶它的工作原理。

而不是派生FileThreadCWinThread,它可能是更好地去把握一个CWinthread*你的包装类中的成员变量,并在必要时通过访问露出线程处理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

删除线程时崩溃

来自分类Dev

删除CStringArray *时崩溃

来自分类Dev

删除对象时崩溃

来自分类Dev

删除洪流时Deluge崩溃

来自分类Dev

在Android中杀死/关闭线程时崩溃

来自分类Dev

为什么启动线程时表单崩溃?线程安全吗?

来自分类Dev

线程崩溃

来自分类Dev

在Qt中删除和清理工作线程崩溃

来自分类Dev

删除对象时mutableArrayValueForKey NSMutableArray崩溃

来自分类Dev

从元组中删除变量时崩溃

来自分类Dev

快速删除文本时,Android AutoCompleteTextView崩溃

来自分类Dev

通过析构函数删除时崩溃

来自分类Dev

在SwiftUI中从coredata删除记录时崩溃

来自分类Dev

删除row和tableView时崩溃

来自分类Dev

C ++应用程序在删除时崩溃

来自分类Dev

删除指向堆的指针时程序崩溃?

来自分类Dev

设置多线程调试(/ MTd)(C ++)时发生崩溃

来自分类Dev

尝试在线程中显示AlertDialog时,应用崩溃

来自分类Dev

我的Android应用程序的gameLoop线程在退出时崩溃

来自分类Dev

在崩溃时查找所有线程的当前状态

来自分类Dev

启动大量线程和块时,CUDA printf()崩溃

来自分类Dev

使用此线程代码时我的应用崩溃

来自分类Dev

Android的UI不是在崩溃时修改视图关闭UI线程

来自分类Dev

检查主线程时,UILabel类别块属性崩溃

来自分类Dev

在线程中启动MessageBox时遇到崩溃

来自分类Dev

UI线程等待AsyncTask时应用程序崩溃

来自分类Dev

启动大量线程和块时,CUDA printf()崩溃

来自分类Dev

PHP:读取管道流时发生线程崩溃

来自分类Dev

从内存中删除Java中的线程时?