c#和MFC中可以创建UI控件及模态/非模态对话框,Qt中只能在主UI线程中创建访问UI控件。
c#和MFC中可以通过全局变量或指针句柄等方式在工作线程中访问其他UI线程控件,其中c#需要Invoke,mfc中线程不安全可能发生未知异常;Qt中只能在主UI线程中创建访问UI控件,如果通过访问全局UI控件指针方式则线程不安全可能回发生未知异常。间接通过信号槽postEnvet方式。
工作线程创建UI对话框需要考虑工作线程是否有Qt(事件循环)不能创建,MFC(子窗体消息循环)domodal开启消息循环,c#(子窗体是否有消息循环)showdialog开启消息循环,类似消息泵的问题。

C#中子线程访问主UI线程的方法:
1.子线程中调用主UI控件对象然后Invoke,异步委托
2.子线程找到主线程句柄并发送消息,UI线程重写winpro消息循环。
3.设置跨线程安全检查属性为false。
注意:c#中子线程中可以创建UI控件,ui控件时哪个线程创建的则只能在哪个线程上安全访问。
对于windows来说,所有的线程都是一样的,但MFC却把线程区分为两种:用户界面(UI)线程和工作者线程。用户界面线程具有消息循环而工作者线程没有。UI线程可以创建窗口并给这些窗口发送消息,工作者线程执行后台任务,因其不接受用户直接输入蘑菇不需要窗口和消息循环。
MFC中子线程访问主UI线程的方法:(工作线程中可以创建UI控件,主UI线程中控件指针对象理论上可直接被子线程操作,但不是线程安全可能会有未知异常)
1.通过创建子线程的时候向线程创建函数里传送UI句柄作为参数,然后在线程方法中把UI句柄赋值转换为UI控件访问。
2.通过UI线程和主线程两端分别发送消息并重写Winpro消息循环实现线程间交互。
3.将UI控件指针赋值到一个全局变量的UI控件指针变量中,在子线程中访问全局指针(此种方法不是线程安全可能会有未知异常)。
注意:MFC线程内获取主窗口句柄方法:CWnd* h_q = AfxGetApp()->GetMainWnd(); //获取主窗口的句柄
在工作线程中重新获取一遍控件的句柄。
CWnd* edit = AfxGetApp()->GetMainWnd()->GetDlgItem(IDC_EDIT1);//获取主窗口编辑框控件的句柄

工作线程
首先是创建模态的对话框:
要清楚一点:DoModal函数是阻塞的,程序执行到这里就停了,直到把该模态对话框关闭之后,才继续执行。而非模态对话框是不管对话框创建完消没消失,程序都会向下走。

UINT _cdecl  C多线程Dlg::ThreadProc(LPVOID lpParameter) 
{
 C多线程Dlg *pThisDlg = (C多线程Dlg *)lpParameter;//获取当前主对话框的指针,要进行强转
 CTestDlg dlg1;
 dlg1.DoModal();//在线程函数中创建模态的对话框,把dlg对象显示为模态对话框
 return 0;
}
void C多线程Dlg::OnBnClickedBtn()
{
CWinThread *pThread = AfxBeginThread(ThreadProc,this);
}
线程退出了,线程函数就结束了,响应申请的资源就释放了,所以DoModal阻塞在那儿模态对话框不会退出,非模态对话框就自然而然的消失了。

工作线程没有消息循环,对话框界面的刷新工作,包括接受用户的鼠标键盘操作,都不会响应,但我们可以给他一个消息循环,但如果都这样做了,那为什么不去用界面线程呢,界面线程考虑的会更全面。

QT中子线程访问主UI线程的方法:
1.GUI线程和辅助线程
如前所述,每个程序在启动时都有一个线程。这个线程被称为“主线程”(在Qt应用程序中也称为“GUI线程”)。Qt GUI必须在这个线程中运行。所有小部件和几个相关类(例如QPixmap)都不能在辅助线程中工作。辅助线程通常称为“工作线程”,因为它用于从主线程卸载处理工作。
首先,子线程不能创建与UI有关的对象,但是可以这样子做.只能在子线程中发一个信号到主线程中,由主线程创建对话窗口.子线程发完信号后,在子线程中while循环调用事件循环,.对话窗口退出之后,主线程调用接口,结束子线程的while循环!
默认的线程在Qt中称为窗口线程,也叫主线程(UI线程),负责窗口事件处理或者窗口控件数据的更新
子线程负责后台的业务逻辑处理,子线程中不能对窗口对象做任何操作,这些事情都要交给窗口线程处理
主线程和子线程之间如果要进行数据的传递,需要使用Qt中的信号槽机制,或postEnvet
1. 线程与界面组件需要注意的地方
在QThread线程中不能直接创建QWidget之类的界面组件.
因为在QT中,所有界面组件相关的操作都必须在主线程中(也就是GUI thread)
所以, QThread线程不能直接操作界面组件.
2.QThread线程如何操作界面组件-方法1
将多线程类对象封装为GUI界面类的类成员
然后在子线程定义信号函数,通过信号槽机制,向界面组件emit发射信号,从而实现间接操作.
3.QThread线程如何操作界面组件-方法2
使用QApplication::postEvent()实现向界面发送事件,从而能够封装一个自定义类
4.使用Invokes()函数来调用界面组件的信号槽-方法3
一般使用该函数(用来调用对方的私有信号或槽):

c#,c++,qt中多线程访问UI控件线程的问题汇总相关推荐

  1. [转] c#中 多线程访问winform控件

    原文 c#中多线程访问winform控件的若干问题小结 我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来解决这个问题,下面我将详细的 ...

  2. C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)

    概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现"线程间操作无效: 从不是创建控件的线程访问它"的异常.处理跨线程更新Winform UI控件常用 ...

  3. qt自定义类访问ui控件

    比如想在类A中访问mainwindow里面的LineEdit. 在类A里面定义一个 QLineEdit *ed;然后就可以用ed->setText()这些函数. 然后在mainwindow里面实 ...

  4. qt designer使用自定义ui控件

    文章目录 qt designer使用自定义ui控件 使用须知 插件应该存放的位置 Qt creator内置的designer 独立的designer 构建一个可使用的插件 Qt creator内置的d ...

  5. Qt 中容器类型的控件

    转载:https://subingwen.cn/qt/qt-containers/ 1.QWidget 这个类是所有窗口类的父类,可以作为独立窗口使用,也可以内嵌到其它窗口中使用. Qt 中的所有控件 ...

  6. qt中创键树形控件QTreeWidget与QStackWidget相绑定

    引言 实现点击下拉列表的项对应的跳转到相应的堆栈窗口,且每个堆栈窗口中都有各自的树形控件,更换可执行文件所在目录下的文件data.json后,点击更新按钮,可以更新所有堆栈窗口的树形控件. 效果 示例 ...

  7. Qt中鼠标滑过控件由箭头变成手型QWidget::setCusor()

    qt中,当要实现鼠标进入某个控件区域时,鼠标箭头变为手型效果,可以用函数QWidget::setCursor(),其中该函数原型如下所示:(该代码对于任何继承于QWidget的控件都有效,也就是无论是 ...

  8. QT中常用的输入控件

    Qt Creator有15种Input Widgets,如下图:     Input Widgets的Qt类和名称介绍如下表 控件类     控件名     中文名     控件类     控件名   ...

  9. C# WinForm跨线程访问UI控件

    C# 跨线程访问控件 在做WinForm时,在UI线程之外调用控件会报异常:System.InvalidOperationException:"线程间操作无效: 从不是创建控件"l ...

最新文章

  1. CentOS SVN服务器管理多项目
  2. selenium 无法定位打开a链接_测试干货 :Selenium8种元素定位法
  3. python控制流_Python学习--控制流
  4. 大数据之MapReduce详解(MR的运行机制及配合WordCount实例来说明运行机制)
  5. 标准模板库之双向循环链表的内部关系
  6. Maven常用参数说明
  7. Web_audio_spatialization_basics
  8. Oracle忽略hint的几种情形
  9. JUnit-三角形判断测试
  10. 调整数组顺序使奇数位于偶数前面(剑指offer)
  11. 装linux系统为什么会黑屏_Ubuntu安装时出现黑屏问题的解决
  12. c语言小游戏编程弹珠游戏,c语言 弹弹球小游戏
  13. 主成分分析二级指标权重_(转)确定权重方法之一:主成分分析
  14. selenium爬取维基百科信息
  15. ES6最详细/易懂教程
  16. 最薄翻转笔记本 联想Yoga13-IFI 6700
  17. 山重水复疑无路,柳暗花明又一村 。
  18. RelativeLayout 设置控件在最上层
  19. SprinBoot集成disConf的过程梳理
  20. 看《江山美人》,让我三次笑场

热门文章

  1. 模拟开关/多路复用器(CH442E)
  2. NetBox创建Unity本地服务器
  3. linux双系统联网设置,双系统及linux 虚拟机搞定,成功配置好教育网更新和联网状态...
  4. Mysql用于收回权限语句_MySQL收回权限
  5. 图形学:图像围绕着某个点P(a,b)旋转------白话版
  6. Rasa特征提取之CountVectorsFeaturizer
  7. 17、内网渗透测试定位技术总结
  8. 用c语言写的跟踪算法,浅谈STC跟踪算法
  9. xss-labs/level6
  10. Excel高级办公技巧,最轻松的方法,让你的工作效率更高效。