关于UI线程和子线程数据交互的问题

大板牙花生 2018-07-01 11:31:29
主线程负责绘制UI,现在新开子线程,负责大量计算,然后UI实时读取子线程数据,读完以后删掉已读的子线程数据,请问该如何实现啊?我用经典的生产者消费者,一旦用锁,就造成UI线程阻塞假死
...全文
886 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
火花20180731 2019-03-15
  • 打赏
  • 举报
回复
你用锁界面就会卡住,这说明你这锁用得不太恰当。。。

比如你在线程工作一开始加锁,线程执行很长工作之后才解锁,那么这段时间内界面执行任意操作,必然会阻塞在加锁的过程。

你应该准备一个线程的任务队列,每次UI操作触发的动作就是:1.加锁 2.添加新任务到任务队列 3.解锁

而线程这边则可以一直开着:
void run() {
while (1)
{
int hasTask = 0;
ThreadTask tt;
// 加锁
if (!taskQueue.isEmpty())
{
hasTask = 1;
tt = taskQueue.dequeue();
}
// 解锁
if (hasTask)
{
if (tt.cmd == THREAD_TASK_QUIT)
break;
else
// TODO
}
}
}
这样加锁解锁的过程就会比较短暂,界面操作几乎感觉不到卡顿
kbasm 2018-09-16
  • 打赏
  • 举报
回复
观察者模式,线程间派发时间。
我的 eventpp 库就是用来在C++中派发事件的,线程安全…………
Acuity. 2018-09-01
  • 打赏
  • 举报
回复
信号量、消息队列、邮箱,随便一个都适合你。
赵4老师 2018-07-30
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
大板牙花生 2018-07-29
  • 打赏
  • 举报
回复
引用 11 楼 xian_wwq 的回复:
1楼正解,PostMessage是必备的

现在遇到一个不解。消息循环机制是应该放到主线程还是子线程?按理来说是应该放到主线程的。是吧?但是主线程如果还是执行大量信息的话还是容易阻塞的
走好每一步 2018-07-04
  • 打赏
  • 举报
回复
多线程用多了就有感觉了,这种别人教你,你也学不会。
xian_wwq 2018-07-04
  • 打赏
  • 举报
回复
1楼正解,PostMessage是必备的
走好每一步 2018-07-03
  • 打赏
  • 举报
回复
UI线程(主线程)不要试图去操作工作线程,而是由工作线程处理好数据,用消息的方式抛回给主线程。
赵4老师 2018-07-03
  • 打赏
  • 举报
回复
《Windows核心编程》
赵4老师 2018-07-03
  • 打赏
  • 举报
回复
英语也是一门计算机语言的说。
赵4老师 2018-07-03
  • 打赏
  • 举报
回复
microsoft官网的英文资料还不够权威?
大板牙花生 2018-07-03
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx

不是懒的学习,而是找了很多资料,不知道哪个权威,而且英文理解感觉自己有偏差。能不能推荐几个关键词啊
  • 打赏
  • 举报
回复
用锁假死,应该是这里出了问题“UI实时读取子线程数据,读完以后删掉已读的子线程数据”
sghcpt 2018-07-02
  • 打赏
  • 举报
回复
楼主可以使用线程通信的一些机制来实现你的需要呢。。例如你可以把主线程的UI的窗口句柄传给计算线程,然后计算线程计算得到的结果,可以new出一块内存保存计算线程计算出来的结果,再通过PostMessage函数向主线程发送消息,主线程收到消息获取到计算的结果,然后处理完数据后,就把new出来的那块内存释放掉(也可以使用内存池的方法减少增加和删除内存的性能消耗)。希望回答对你有帮助。
赵4老师 2018-07-02
  • 打赏
  • 举报
回复
Multiple Threads in the User Interface http://msdn.microsoft.com/zh-cn/library/ms810439.aspx
大板牙花生 2018-07-02
  • 打赏
  • 举报
回复
是的问题是出在读取修改子线程问题上了,想不到有更好的解决办法了

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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