在线程里能操作UI吗?

科比布莱恩特 2012-08-01 04:44:41
在线程里能操作UI吗?如果不能,为什么?
...全文
353 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
JoeBlackzqq 2012-09-07
  • 打赏
  • 举报
回复
SendMessage是阻塞方式,而PostMessage是非阻塞方式的!
科比布莱恩特 2012-09-02
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

引用 5 楼 的回复:

不能,SendMessage给ui线程


最好是用PostMessage
[/Quote]

这里为什么要使用Postmessage?
XNightSky 2012-08-24
  • 打赏
  • 举报
回复
如果多线程控制(2个以上或者具体问题具体分析)这个LPVOID para指针还有考虑并发问题,还有去看一下堆栈,操作指针的方法,最终还是大部分去调用window API和比较常用的SendMessage
XNightSky 2012-08-24
  • 打赏
  • 举报
回复
SendMessage 要考虑互锁问题
SendMessage 和 PostMeessag 根据情况混合使用吧
breezes2008 2012-08-24
  • 打赏
  • 举报
回复
是行的,看你个人需求呀。
不过要非常注意窗口的消息是以线程周期存在。
千万不要在子线程中创建一个新窗口,除非有子线程有消息循环。
「已注销」 2012-08-17
  • 打赏
  • 举报
回复
本线程只能处理发给本线程创建的窗口的消息。
Tishion 2012-08-17
  • 打赏
  • 举报
回复
在Windows 平台下是可以的 但是不建议直接操作。

在java的那套AWT下工作者线程如果直接操作界面线程就直接出错
JoeBlackzqq 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

不能,SendMessage给ui线程
[/Quote]

最好是用PostMessage
hzy694358 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

因为MFC设计的时候没有考虑线程安全。
[/Quote]
up
这个有时候可能可以,但是莫名其妙就出问题
在线程里发送消息方式处理
yusheng628 2012-08-17
  • 打赏
  • 举报
回复
貌似是不行的,同时操作会导致界面闪烁
pig357 2012-08-17
  • 打赏
  • 举报
回复
可以操作。

DWORD CXXXView::SocketConnectThreadProc(LPVOID parg) //通讯线程函数,用于连接下位机
{
CXXX* view = (CXXXView*)parg;
...
view->m_infoLabel.SetText(_T("连接成功"));
。。。
}
chayedanwc 2012-08-14
  • 打赏
  • 举报
回复
线程操作UI有一个很容易出现的异常,UI被销毁后如果线程没有退出,仍然对UI进行操作,那么程序会崩溃。
mmcanyu 2012-08-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
因为MFC设计的时候没有考虑线程安全。
[/Quote]

其实也不能算MFC设计的问题,MFC类库(大部分例如CWnd之类的)只是封装了对窗口句柄的操作而已,但是如果多个线程同时操作一个界面,就会乱套了。比如这个线程在Paint,另一个线程同时也要Paint,怎么办。所以使用了线程局部存储(TLS),只允许操作本线程创建的MFC对象。如果是SDK编程,线程操作窗口的时候,还不是得乖乖的SendMessage或者PostMessage。
MFC库里面已经使用了大量的SendMessange了,这些函数是线程安全的。比如CTreeCtrl。

如果非要在线程里面操作窗口对象,就要锁。可是太多锁写在“基础类库”里就太影响效率了,也不符合MFC设计的初衷。
zhaojade 2012-08-07
  • 打赏
  • 举报
回复
线程里操作ui,和操作别的不是一样吗,要是多个线程同时操作,你保证没问题?
想在线程里操作,楼上给出答案了
lijianli9 2012-08-07
  • 打赏
  • 举报
回复
因为MFC设计的时候没有考虑线程安全。
bsnry 2012-08-02
  • 打赏
  • 举报
回复
不能,SendMessage给ui线程
mmcanyu 2012-08-02
  • 打赏
  • 举报
回复
试一下在线程里,pDlg.UpdateData(),就知道为什么了.
科比布莱恩特 2012-08-02
  • 打赏
  • 举报
回复
为什么不能操作UI?有什么不好吗?
傻X 2012-08-01
  • 打赏
  • 举报
回复
能啊。不为什么,把指针传进来
线程UINT Process(LPVOID para)
{
XXX * abc = (XXX *)para;
}
dahaiI0 2012-08-01
  • 打赏
  • 举报
回复
不能操作别的线程的UI。参考win32多线程程序设计,记得好像是第十章

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧