首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问线程中的主对话框变量(MFC)

访问线程中的主对话框变量(MFC)
EN

Stack Overflow用户
提问于 2015-06-25 08:05:53
回答 1查看 955关注 0票数 0

我有一个带有MFC的GUI应用程序。我使用AfxBeginThread()调用线程来处理一些数据。我在访问线程中的主对话框时遇到了问题:

通过此结构,我将主对话框处理程序和指向主dlg对象的指针传递到线程。但是在strcpy()行调试器停止并显示pDlg->0x430f0020 {CTabDlg hWnd=??}

代码语言:javascript
复制
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操作系统。在XP中,它总是崩溃,但在七种情况下,它可以工作。以下是我将结构传递给线程的方式:

代码语言:javascript
复制
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);

谢谢您抽时间见我!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-25 08:48:51

如果您的代码与实际情况完全相同,那么这里您将声明一个本地sParamData并将其地址传递给线程。这提供了一个争用条件:s可以在线程开始执行之前超出范围(或者到达复制其内容的点)。

代码语言:javascript
复制
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,并在复制其内容之后在线程中删除它。

如下所示:

代码语言:javascript
复制
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);

然后,在线程内部

代码语言:javascript
复制
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 ;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31044609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档