2014-06-13 46 views
-2

我有一個對話框。在這個對話框中:: OnInitDialog()我創建了一個線程AfxBeginThread((AFX_THREADPROC)MyThreadProc,NULL);它崩潰時,我關閉與運行時檢查失敗的對話框,並且它指向thrdcore.cpp文件(Microsoft基礎類C++庫)C++運行時檢查失敗#0 - ESP的值沒有正確保存在...檢查簡單工作線程的點

// first -- check for simple worker thread DWORD nResult = 0; if (pThread->m_pfnThreadProc != NULL) { nResult = (*pThread->m_pfnThreadProc)(pThread->m_pThreadParams); ASSERT_VALID(pThread); } 我有一個代碼,以殺死線程的OnClose功能,但它不」解決問題。有一些可以幫助,我錯過了什麼?我對

HANDLE m_hExit; 
DWORD dwResult = 0; 
unsigned threadID = 0; 
... 


OnInitDialog() 
{... 

m_hExit = (HANDLE)AfxBeginThread((AFX_THREADPROC)MyThreadProc, NULL); 
} 

OnClose() 
{ 

    dwResult = WaitForSingleObject(m_hExit, 0); 
if (dwResult == WAIT_TIMEOUT) 
{ 
    printf("The thread is still running...\n"); 
} 
else 
{ 
    printf("The thread is no longer running...\n"); 
} 
Sleep(10000); 
dwResult = WaitForSingleObject(m_hExit, 0); 
if (dwResult == WAIT_TIMEOUT) 
{ 
    printf("The thread is still running...\n"); 
} 
else 
{ 
    printf("The thread is no longer running...\n"); 
} 
CDialog::OnClose(); 

} 

線程函數的代碼是非常大的((((

+3

堆或堆棧已損壞,殺死線程並不能解決問題。您顯示的代碼很好,我懷疑錯誤在線程功能中,請粘貼代碼。 – Matt

+2

您轉換爲AFX_THREADPROC表明您的線程函數可能沒有所需的簽名。它必須具有記錄的線程函數返回類型和參數。 –

+0

我的函數定義UINT WINAPI MyThreadProc(LPVOID pParam) – user2001019

回答

4

AfxBeginThreaddocumented爲要求ThreadProc的是

UINT __cdecl MyControllingFunction(LPVOID pParam); 

您的評論說,你的功能是

UINT WINAPI MyThreadProc(LPVOID pParam) 

WINAPI被定義爲_stdcall(參見here

所以你有一個調用約定不匹配。正如其他人已經評論的那樣,演員陣容是可疑的。事實上,這是你的代碼編譯的唯一原因。如果刪除了強制轉換,編譯器應該顯示一個錯誤。

解決方案是刪除轉換,然後修復您的函數調用約定。一旦該代碼在沒有轉換的情況下編譯正確,它應該正常運行而不會損壞堆棧。

+0

雷蒙德陳的文章,進入這個問題的一些細節:http://blogs.msdn.com/b/oldnewthing/archive/2004/01/15/58973.aspx和他的相關文章使用一個演員關閉編譯器:http://blogs.msdn.com/b/oldnewthing/archive/2009/10/23/9911891.aspx –

+0

你是對的關於強制轉換,在我刪除了轉換後的函數調用,這導致編譯器抱怨。然後我改變了函數定義,它停止抱怨並編譯好。雖然它沒有解決我的問題。我的應用程序仍崩潰。在我之前展示的地方。我有一個while(1)循環內部的這個函數。它在xx.Format(「%c%c%c%c%c%c%c%c」,*(p + 5),*(p + 6),*(p + 7),* (p + 8),*(p + 9),*(p + 10),*(p + 11));這裏出了什麼問題。如果函數能夠通過循環幾次爲什麼它崩潰? – user2001019

+1

@ user2001019我沒有足夠的信息來說明,但是因爲你說它只發生在循環的4次迭代之後,所以這個問題可能也涉及其他代碼。也許有人將p設置爲無效值或將其遞增,直到它離開緩衝區結束。 – TheUndeadFish

相關問題