[英]Access to main dialog variables within thread (MFC)
我有MFC的GUI應用程序。 我正在啟動線程以使用AfxBeginThread()處理一些數據。 而且我在線程中訪問主對話框時遇到問題:
通過此結構,我將主對話處理程序和指向主dlg對象的指針傳遞給線程。 但是在strcpy()行調試器停止並顯示pDlg-> 0x430f0020 {CTabDlg hWnd = ???}
typedef struct {
LPVOID myHandle;
LPVOID myPointer;
} sParamData;
UINT WorkerThreadProc_type2( LPVOID Param )
{
UpdInfo info;
sParamData *s;
s = (sParamData*)Param;
HWND hMainHandle = (HWND) (*s).myHandle;
CtabDlg* pDlg = (CtabDlg*)(*s).myPointer;
strcpy(apikey, pDlg->m_sVar);
...
}
我嘗試了XP和Windows 7 OS。 在XP中它總是崩潰,但在七個中它可以工作。 這就是我將結構傳遞給線程的方式:
sParamData s;
s.myHandle = (HWND)GetSafeHwnd();
s.myPointer = (CtabDlg*) this;
if(CurrTab == 1)
{
AfxBeginThread(WorkerThreadProc_type2, &s, THREAD_PRIORITY_NORMAL,0,0,NULL);
pPage2->GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
感謝您的時間!
如果您的代碼與實際情況完全一樣,那么您在這里聲明一個本地sParamData並將其地址傳遞給線程。 這提供了一個競爭條件:s可以在線程開始執行之前超出范圍(或到達復制其內容的位置)。
sParamData s;
s.myHandle = (HWND)GetSafeHwnd();
s.myPointer = (CtabDlg*) this;
if(CurrTab == 1)
{
AfxBeginThread(WorkerThreadProc_type2, &s, THREAD_PRIORITY_NORMAL,0,0,NULL);
pPage2->GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
最簡單的解決方法可能是在堆上分配s,並在其內容被復制后在線程中將其刪除。
像這樣:
sParamData *s = new sParamData ;
s->myHandle = (HWND)GetSafeHwnd();
s->myPointer = (CtabDlg*) this;
if(CurrTab == 1)
{
AfxBeginThread(WorkerThreadProc_type2, s, THREAD_PRIORITY_NORMAL,0,0,NULL);
pPage2->GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
然后,在線程內
UINT WorkerThreadProc_type2( LPVOID Param )
{
UpdInfo info;
sParamData *s = (sParamData*)Param;
HWND hMainHandle = (HWND) s->myHandle;
CtabDlg* pDlg = (CtabDlg*)s->.myPointer;
// assuming s will no longer be used you can delete it here
delete s ;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.