• 11433阅读
  • 11回复

[讨论]棘手问题:关于线程和模态对话框 [复制链接]

上一主题 下一主题
离线meibined
 

只看楼主 倒序阅读 楼主  发表于: 2012-11-02
最近做项目的时候遇到一个棘手问题,请高手指导下!
问题描述:
1、某些操作可能比较耗时,所以当点击按钮时候必须显示一个模态对话框提醒用户,并屏蔽用户的操作。

本人做法:
1、由于GUI元素只能在主线程里面处理,所以模态对话框只能在主线程里面显示。
这样主线程就处于堵塞状态。
2、QThread里面获取主线程的指针。然后调用主线程的一些函数。
问题描述:
1、主线程里面被调用到的函数很多有涉及到GUI的,要每个都进行重新封装剥离UI元素,很麻烦。
2、有很多这样的耗时的操作。用这种方法不太现实。
求高手指导下。拜谢,拜谢!!!
离线meibined

只看该作者 1楼 发表于: 2012-11-02
自己顶下,求救,求救。。。
离线hohos

只看该作者 2楼 发表于: 2012-11-02
我也是新手,入门级别。。只是正好用到了多线程成员函数,说的可能有错误,还请指正。


调用主线程的成员函数等,可以直接使用 QtConCurrent::run(&OBJ, &OBJ::FUNCMEMBER, FUNCARG1, FUNCARG2)来做。

详情可看<QtCurrentrun>帮助文档。
离线ffii4455

只看该作者 3楼 发表于: 2012-11-02
模态对话框会阻塞线程么?仔细考虑一下哦
离线jdwx

只看该作者 4楼 发表于: 2012-11-02
没弄明白是什么问题,是不是就类似copy一个2G的文件,显示一个进度条,用户可以随时按下取消按钮来取消copy?
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线meibined

只看该作者 5楼 发表于: 2012-11-02
比如MailSet类的界面有一个按钮button,点击button后腰弹出一个模态对话框,该模态对话框时为了:1、提示用户目前正在进行的操作。2、阻止用户在未处理完时进行操作。
然后点击时运行的操作函数是MailSet的成员函数。
要如何处理?


本来想建一个线程来显示那个模态对话框的,后面发现不能再子线程里面操作UI的元素。
所以只好在主线程那边显示模态对话框。但是主线程显示模态对话框的时候消息不是卡住了么?
所以我只好在新建的子线程里面把MailSet类里面要执行的逻辑通过回调函数传到QThread的run里面来执行。但是这些逻辑处理涉及到很多UI相关的元素,代码量大,不好挪动,而且就算挪好了,其他页面还很多类似的的操作,不太现实,你们有没有比较好的办法呢?
离线meibined

只看该作者 6楼 发表于: 2012-11-02
回 3楼(ffii4455) 的帖子
你的意思是用SetMode(ture);和show()来处理?
这个我考虑过了,在一条线程里面做的话还是要等到那个耗时的操作执行完才能显示啊
离线ffii4455

只看该作者 7楼 发表于: 2012-11-02
回 5楼(meibined) 的帖子
主线程显示模态对话框时不是卡住了,而是进入了模态对话框的事件循环(如果你用的是exec)。
主线程肯定是来显示UI的,Qt规定gui线程必须是主线程,所以耗时操作肯定是用子线程进行的。
跨线程也是可以进行信号与槽的连接的,所以没必要回调。

可以这样:
耗时操作写成类,继承自QThread,其中自定义操作完成时所发射的信号。
在主线程中,先实例化耗时类(是类的成员),然后进行连接(例如,信号---关闭模态对话框的槽),执行start,显示模态窗口。
离线jdwx

只看该作者 8楼 发表于: 2012-11-02
回 5楼(meibined) 的帖子
没有什么办法,改。
用信号和槽通信,不会太复杂。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线meibined

只看该作者 9楼 发表于: 2012-11-02
回 7楼(ffii4455) 的帖子
发信号槽其实跟回调差不多
还是要把很多UI剥离出来,然后放到线程里面执行
工作量也是大,我是在想有没有其他办法把显示放到子线程里面去执行
离线meibined

只看该作者 10楼 发表于: 2012-11-02
比如WINDOW里面的进度条
好像可以通过重载回调函数来实现
离线ffii4455

只看该作者 11楼 发表于: 2012-11-02
我不知道你要剥离什么UI。
按照你的需求,就是当线程启动后,显示模态窗口就好,线程结束后自动关闭模态窗口。
好久没用多线程了,正好趁这个机会没事复习了一下,用一个信号和槽连接就搞定了,没有什么剥离啊~~~
快速回复
限100 字节
 
上一个 下一个