簡體   English   中英

訪問線程內的主要對話框變量(MFC)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM