VC在线程中操作界面(一)

版权声明

请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。

多线程是我们在编程中经常遇到的问题,线程执行完后往往要把执行的结果传给主线程,但是MFC的控件不是线程安全的,所以在线程中操作界面是一件很危险的事情。所以就需要安全的方法。这一系列篇文章我将介绍VC在线程操作界面方法。

问题描述:

1.界面上有两个Button m_btn1,m_btn2m_btn创建一个线程,来操作m_btn2

void CMyDlg::OnButton1()

{

_beginthread(ThreadStart,0,(void *)(m_btn2));

}

2.线程执行的代码如下:

void ThreadStart(void* p)

{

CButton *btn = (CButton*)(p);

btn->SetWindowText("aaaaaaa");

}

这是我们想象的代码,但是如果这样写来,是不正确的。是因为MFC窗体程序的界面控件是由主线程来控制的,由于我在新创建的线程中也操作了界面的控件,这样就同时由两个线程操作一个控件。但是这两个线程又没有进行同步。所以就发生了错误。

下面我们就通过让工作线程和主线程进行同步来解决上面的问题。

1.定义MYMSG

#define MYMSG WM_USER +200

2.线程启动的代码如下:

void CMyDlg::OnButton1()

{

_beginthread(ThreadStart,0,(void *)(this));

}

3.线程执行的代码如下:

void ThreadStart(void* p)

{

CString str = "aaaaaa";

CMyDlg *btn = (CMyDlg*)(p);

PostMessage(btn->m_hWnd,MYMSG,WPARAM(&str),NULL);

Sleep(1000);

}

4.添加消息映射

ON_MESSAGE(MYMSG,OnMsgBack)

5.添加消息映射函数的定义和实现

LRESULT OnMsgBack(WPARAM wParam,LPARAM lParam);

LRESULT CMyDlg::OnMsgBack(WPARAM wParam,LPARAM lParam)

{

CString* str = (CString*)wParam;

m_btn2.SetWindowText(*str);

return 0;

}

这样就完成了在线程中操作界面的工作。

注意:

1. 我们也可以使用继承CwinThread的类,然后在消息映射中用

ON_THREAD_MESSAGE来处理往线程中发送的消息。

2. 在线程中往主线程PostMessage发送数据的时候,一定要保证数据在主线程使用之前是存在的。Sleep(1000);是为了保证让主线程先处理到str。否则,执行完ThreadStart函数后,str自动销毁了,然后在外面访问这个已经销毁的指针是非常危险的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值