线程中如何实时显示数据到界面----------------------------------

futurepi 2012-06-27 03:40:14
不谈论用发送消息的方法.
mfc工程, 创建了一个线程,这线程负责实时显示一些数据到 界面上. CMainFrame 里保存了一些界面控件的指针. 自己是这样做的: 直接传递CMainFrame指针,过去后,成员的变量值是正确的, 但通过成员指针调用 界面相关的函数就会出错,

逛了下论坛,看到有一种是传递 hwnd给线程, 但我传CMainFrame.m_hwnd过去 CWnd::FromHandle((HWND)lpPar), 能获得个指针pMain, 但pMain指针里面的成员不是正确的值. 传递句柄的方法可行?
...全文
1161 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
心疼包 2014-07-03
  • 打赏
  • 举报
回复
楼主有没有搞定啊,我也正在处理这个问题,我是完全不会啊,急求指导啊!!!!
futurepi 2012-07-10
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 的回复:]

不发消息的话,就部要传送句柄,直接传指针

比如,你要传送到的窗口类是 Cxxx *AA;
给Cxxx类加一个函数来实现更新

void Cxxx::Flash()
{
动画内容;
}
工作者线程内:
Cxxx *XX=传送进来的指针;
while(1)
{
XX->Flash();
Sleep(100);
}
[/Quote]
前面有提到过, 我用这样的方法在线程中访问状态栏窗格, 会出现断言失败
futurepi 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 的回复:]

引用 31 楼 的回复:

在线程中操作主界面,当然要发消息,而且基本上做不到实时。显示数据太多时,可以实现缩略显示。

++
一个界面上显示的数据是有限的,也可以先显示能让用户看到的数据。如果你用的是clistctrl,还可以参考下面这个http://www.cnblogs.com/mingzi/archive/2008/10/19/1314497.html
[/Quote]
帖子不错, 以后大数据可以考虑
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 11 楼 的回复:

常规的做法还是发送消息给主窗口,让主窗口来刷新数据。只是显示数据应该不会有界面卡的现象,看显示数据时是否有什么比较耗时的操作。

只显示一条, 那很快, 如果显示很多条数据呢,1秒钟几十条,几百条都有可能会让界面有卡的现象. 我想知道, 一个游戏中,界面上有很多只怪物, 几十只怪物同时向你走过来, 同时自己还可以走动, 完全不会感觉到界面有任何卡的感觉……
[/Quote]
我建议你把界面响应的方法定义为CMainFrame的public函数
然后用AfxGetApp去调用这个方法
这样就避免了你在另外一个线程中无法访问CMainFrame一些非public成员的问题
molin0000 2012-07-09
  • 打赏
  • 举报
回复
楼主的想法很不错,我以前一直是用传消息的方式来实现的,不止麻烦,而且会有些许卡顿。看了上述的各种说法后,现在也有些期待,是否有完美的解决方式。我提一下在BCB中的方式,是有一个同步函数,用同步函数处理一下,界面交互就没有任何问题了。
futurepi 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 的回复:]

在线程中操作主界面,当然要发消息,而且基本上做不到实时。显示数据太多时,可以实现缩略显示。
[/Quote]
你说的缩略显示是指
dahaiI0 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 的回复:]

在线程中操作主界面,当然要发消息,而且基本上做不到实时。显示数据太多时,可以实现缩略显示。
[/Quote]
++
一个界面上显示的数据是有限的,也可以先显示能让用户看到的数据。如果你用的是clistctrl,还可以参考下面这个http://www.cnblogs.com/mingzi/archive/2008/10/19/1314497.html
用户 昵称 2012-07-09
  • 打赏
  • 举报
回复
在线程中操作主界面,当然要发消息,而且基本上做不到实时。显示数据太多时,可以实现缩略显示。

futurepi 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 的回复:]

引用
mfc工程, 创建了一个线程,这线程负责实时显示一些数据到 界面上
我发现如果 是线程中访问主框架的菜单资源, 传递指针或句柄都可以, 但如果是要访问其他对象,比如CListView, CSplitterWnd 就会出错.


我的理解,自己新开的线程在MFC中是处理主界面显示和交互的输入输出数据以外的工作的。所以不理解lz将新开线程的功能做那些主线程应该做的事情的目的。MFC给……
[/Quote]

但是,正如我上面说的, 我担心主界面线程一次性 显示更新太多数据会导致界面出现短暂的卡主, 影响用户体验
gz_qmc 2012-07-09
  • 打赏
  • 举报
回复
不发消息的话,就部要传送句柄,直接传指针

比如,你要传送到的窗口类是 Cxxx *AA;
给Cxxx类加一个函数来实现更新

void Cxxx::Flash()
{
动画内容;
}
工作者线程内:
Cxxx *XX=传送进来的指针;
while(1)
{
XX->Flash();
Sleep(100);
}
fronz 2012-07-08
  • 打赏
  • 举报
回复
[Quote]
mfc工程, 创建了一个线程,这线程负责实时显示一些数据到 界面上
我发现如果 是线程中访问主框架的菜单资源, 传递指针或句柄都可以, 但如果是要访问其他对象,比如CListView, CSplitterWnd 就会出错.
[/Quote]

我的理解,自己新开的线程在MFC中是处理主界面显示和交互的输入输出数据以外的工作的。所以不理解lz将新开线程的功能做那些主线程应该做的事情的目的。MFC给出了现成的架构格式,这个架构决定了,我们只有用这种方式才能获得比较高的软件运行效率。
futurepi 2012-07-07
  • 打赏
  • 举报
回复
到现在为止,以上总结了下就是 多线程中不能访问/修改界面线程的东西.
还是没能解决我的疑惑
futurepi 2012-06-29
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 的回复:]

会出问题吗?我经常这样做都不会有问题呀。
在线程中定义一个指针:CMainFrame *m_pParent,然后在启动线程后通过返回的线程的指针把CMainFrame的this指针赋给m_pParent:pThreadPoint->m_pParent = this;
然后在线程中通过m_pParent操作框架类中的方法与变量都没有问题。
[/Quote]
你是直接吧CMainFrame指针 作为参数传到线程中去? 然后线程通过CMainFrame 指针 直接访问控件变量了是吗. 你试下 线程中能否正常 插入一条数据到 CListView 控件

dahaiI0 2012-06-28
  • 打赏
  • 举报
回复
通常说的传句柄到线程里都是通过这个句柄发送消息给主窗口来响应。MFC对象和句柄的关系保存在线程的TLS里,如果你传个句柄,然后用FromHandle得到一个窗口指针,在然后用这个指针去访问其成员变量或函数是有问题的,为什么有问题请看资料http://support.microsoft.com/default.aspx?scid=kb;en-us;147578

如果你跨线程传递指针,的确是可以通过这个指针访问到某些成员变量和成员函数,但是最好别这样干,首先MFC对象不是线程安全的,再者前面说了MFC对象和句柄之间的对应关系保存在创建这个MFC对象的线程里(具体是线程的TLS的一个map里),调用某些成员函数比如UpdateAllViews时会检查当前线程的TLS里是否存在MFC对象和句柄的对应关系,结果当然是没有的,于是断言失败
MingoJ 2012-06-28
  • 打赏
  • 举报
回复
会出问题吗?我经常这样做都不会有问题呀。
在线程中定义一个指针:CMainFrame *m_pParent,然后在启动线程后通过返回的线程的指针把CMainFrame的this指针赋给m_pParent:pThreadPoint->m_pParent = this;
然后在线程中通过m_pParent操作框架类中的方法与变量都没有问题。
Eleven 2012-06-28
  • 打赏
  • 举报
回复
创建线程的时候,就将HWND窗口句柄作为线程函数的参数传递给线程,在线程函数中发送自定义的消息到UI线程,在UI线程的自定义消息响应函数中去更新控件信息
futurepi 2012-06-28
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]

引用 19 楼 的回复:

大家都是说用 发送消息的方法, 那我想知道 一个游戏中界面的处理,怪物移动 和自己移动是不是都是截面线程来完成的: 一个游戏中,界面上有很多只怪物, 几十只怪物同时向你走过来, 同时自己还可以走动, 完全不会感觉到界面有任何卡的感觉, 我觉得他这应该不全是界面线程来处理的, 毕竟怪物走动的同时自己随时随地也在走动, 也就是说游戏截面显示处理中 有些是在多线程中处……
[/Quote]

我可没说一个怪物一个线程, 只是说几十只怪物要同时移动,加上界面线程要随时捕获玩家的鼠标键盘消息,让角色移动,如果都是在一个界面线程中处理,那肯定有先后顺序, 要嘛先处理玩家移动在处理怪物移动,即可能造成 玩家走的时候怪物不动. 游戏中界面处理的很多, 举这个例子只是想知道说线程中是否真的可以操作界面?
sichuanwww 2012-06-28
  • 打赏
  • 举报
回复
发送消息
康斯坦汀 2012-06-28
  • 打赏
  • 举报
回复
不鼓励在工作线程中访问任何主UI线程的对象,正确的方式就是发消息,直接访问虽然是可以的,
但是很危险的。将来真正多任务多线程并发时代到来以后,这样就更不允许了,所以将来写代码会
告别面对对象的时代,转而恢复函数过程调用的时代。编程的革命即将到来,到时我们熟知的现在
流行的编程方式都会发生革命性的变化。
康斯坦汀 2012-06-28
  • 打赏
  • 举报
回复
其实对于游戏设计中很多的东西都是很简单的,楼主不必想的过于复杂。
比如,怪物的动作是预先绘制好的,各个方位的动作,然后传递一定参数决定动作的执行,
这样运行起来就是连续的,然后不同怪物按照随机或者某些算法决定不同的动作执行条件,
循环处理一下几百个看上去都是一起做的,然后游戏一般会设置一些触发条件,比如RPG
会在屏幕打格,当用户操作主角到哪个格子里就触发什么事件等等。
加载更多回复(18)

15,471

社区成员

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

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