QT小白提问:QT主线程阻塞、唤醒其他线程 1C

想实现主线程控制子线程的功能。

主线程类似于:
while
{
获取当前子线程
挂起当前子线程
获取下一个运行线程
唤醒下一个运行线程
}

子线程实现如下:
void subThreadProcess(void)
{
while
{
do something
}
}

在主线程中只能访问到子线程的接口subThreadProcess,无法知道其内部实现。
现在底层要求用QT实现,能够阻塞或者唤醒选定的线程。

类似于windows中的suspendThread和resumeThread功能。

QT大神帮忙下?谢谢~

1个回答

u011916206
宝宝吃肉 run函数中只能调用subThreadProcess,在subThreadProcess内的while循环中没有使用qt机制
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
QT其他线程和UI主线程通信方式
1:为什么会有这个问题:      其实当我们真正开发一个有实体业务需求的界面软件的时候,就躲不开上面提到的问题——QT其他线程和UI主线程通信。原因是什么,耗时的操作不能再界面ui线程中操作执行,这样会让界面卡死,当然这不仅仅是QT有这个问题,MFC、安卓都是这样的。但现实是你躲不开业务的耗时操作,比如你点击一下按钮,可能按钮对应的底层业务逻辑需要执行一大堆东西,没办法不耗时。当然从另外一个角度...
线程的阻塞及唤醒
demo:   为方便展示,这里有两个类 : Tasker 、Customer   在Customer中,其构造器需要传入Tasker对象,这样我们才能在后面的代码中捕获当前tasker对象,并唤醒该对象等待的线程。   public class Tasker implements Runnable{ public void doSth() throws Interrupte...
关于Qt中线程的挂起和唤醒问题
为了平台的可移植性,现在好多公司或开发者都在用Qt开发,但是Qt开发文档有一个不非常理想的问题是,有些问题描述的不是太详细,特别是涉及到线程的挂起,唤醒、和sleep()等问题。 在Qt开发中,有许多开发人员常常继承线程QThread,在run()函数内执行要在线程执行的代码,特别是应用在网络多线程接收发的开发中。例如在网络接收和发送数据中,在run()函数内,写了一个while(1)或fore
【Qt多线程之线程的等待和唤醒】QWaitCondition
QWatiCondition的成员函数·QWaitCondition() ·~QWaitCondition() ·bool wait ( QMutex * mutex, unsigned long time = ULONG_MAX ) ·void wakeOne () ·void wakeAll ()QWatiCondition::wait()·bool wait ( QMutex *
QT中子线程与主线程通讯的方法
子线程可以通过信号量与槽来传递数据给主线程,让主线程更新,下面是一个最简单的例子,界面中只有一个label,主线程中通过movetothread的方法创建了一个子线程,然后子线程中不断触发showNum信号让主线程调用DisplayMsg来更新label。 头文件: class MainWindow : public QMainWindow { Q_OBJECT public: ...
关于qt主线程和次线程的一点疑惑
最近比较关注qt的多线程。看了http://apps.hi.baidu.com/share/detail/23550552 这篇文章后,才发现自己以前对qt的多线程认识是错的!比如自己写一个qthread子类,除了run()这个函数是在次线程执行的,其它函数都是在主线程被调用的,因为qthread类就是一个qobject,它是在主线程创建的,自然它的那些非run()函数以及各种数据成员都属于主线程。rn 我自己写了个小的测试程序,分别在主线程中实例化QThread子类对象、QObject子类对象、以及一个自己定义的基类对象,然后在这些对象构造函数里分别打印当前的QthreadId。在主线程中定义的对象自然应该和主线程id一致,可是结果却并非如此:rn Object/ObjectNew是我定义的两个继承自QObject类的子类,它们都在各自的构造函数里打印当前线程的id,比如rn[code=C/C++]rnObject::Object(QObject *parent) : rnQObject(parent) rn rn cout<<"obj construct:"<
唤醒阻塞休眠线程示例
如何唤醒或者退出被阻塞,休眠的线程,非TerminateXXX方法
Qt开机唤醒狩猎者
当Windows开机或唤醒时,会自动拍照,并且会保存在新建的文件夹里面,此源码在CSDN IT1995有详细的说明
主线程和其他线程问题
如果主线程把它的其他线程创建到其他进程中,rn 当主线程正常退出时,是否回自动是否在其他进程中的线程。rn 如主线程非正常退出,其他进程中的线程回如何呢?
qt等待阻塞的解决方案
    在开发中我们经常用到等待,阻塞,比如每个5秒钟请求一次服务器,但是这个时候我们使用QThread::sleep这个函数,但是这个函数有一个缺点,就是他会阻塞Qt的事件循环,我们界面会卡死。   所以有一种比较好的方法,就是QEventLoop。   QTimer timer; timer.setInterval(5000); // 设置超时时间 5 秒 ...
qt线程
我用一个子线程去和一个载波设备通信,此线程主要完成与设备网络连接、给设备发送数据和接收设备回复的数据,首先要连接成功才能进行收发工作,但是连接状态总是正在连接,所以不能进行数据收发,急求解答!!!
Qt线程
以下结果经实验证明正确:1.在多线程中,主线程调用的子线程的函数全部在主线程运行,只有重写的run()函数是在子线程里面进行运行。以上为实验结果,可以看出主线程的线程ID为0x3394,在主线程中调用的两个子线程里面实现的函数运行时的线程ID与主线程的ID相同,只有run()函数里面的代码的线程ID为0x3bc8.具体实现代码就不贴了,太麻烦,此博客主要为以后复习提供帮助。...
qt线程套路,qt线程源码分析
qt源码地址: https://github.com/radekp/qt/blob/b881d8fb99972f1bd04ab4c84843cc8d43ddbeed/src/corelib/thread/qthread_unix.cpp        Qt的线程应该是大家讨论比较多的,也是迷惑比较多的。这主要和qt线程实现机制和上层封装出的接口有关,封装的不清不楚,接口要么就封装的完全不知道里...
QT 线程
QT 线程背景QThread实践 背景 复习中,突然突发奇想用QT做一个倒计时工具,然而我只是一个QT小白,啥都不懂。于是乎经历了一番波折,终于将QT环境部署完毕,然后就做下面的一个简单界面: 然而时间的更新是个问题,于是乎想到用线程解决时间刷新,每隔一段时间对当前时间和目标时间进行比较得到 差值,但是界面更新确是个难题。 QThread The QThread class provides a...
QT之线程
一、QT中线程使用原则 在实际的开发中线程的使用频率很高,尤其是在开发界面程序的时候。QT的UI线程负责界面的事件相应,而一些复杂的逻辑运算可以放在一个子线程中进行。QT中线程的使用有一个原则,对于界面的操作只能在UI主线程中操作,子线程不能对UI界面进行操作。如果在子线程中需要对界面进行操作,可以使用信号通知UI主线程,由UI主线程进行操作。
Qt 线程
mythread.hrn[code=c]rn#ifndef MYTHREAD_Hrn#define MYTHREAD_Hrnrn#include rnrnclass MyThread : public QThreadrnrn Q_OBJECTrnpublic:rn explicit MyThread(QObject *parent = 0);rn void run();rn bool stop;rnsignals:rnrnpublic slots:rnrn;rnrn#endif // MYTHREAD_Hrn[/code]rnmythread.cpprn[code=c]rn#include "mythread.h"rn#include rn#include rnrnMyThread::MyThread(QObject *parent) :rn QThread(parent)rnrn this->stop = false;rnrnrnvoid MyThread::run()rnrn qDebug() << "running";rnrn QMutex mutex;rn mutex.lock();rn for(int i = 0; i < 10; i++)rn if(this->stop)rn rn break;rn rn qDebug() << i;rn rn mutex.unlock();rn qDebug() << "finished";rnrnrn[/code]rnmain.cpprn[code=c]rn#include rn#include "mythread.h"rnrnint main(int argc, char *argv[])rnrn QCoreApplication a(argc, argv);rnrn MyThread mThread;rnrn mThread.start();rnrn mThread.stop = true;rnrn return a.exec();rnrn[/code]rn疑问:mThread.start()调用了run()之后,怎么就在循环里break了?mThread.stop = true;不是在mThread.start();之后才赋值为true吗?这执行顺序不太懂~求解~
Qt :线程
在多核时代,随着 CPU 主频的提升,受制于发热量的限制,CPU 散热问题已经进入瓶颈,另辟蹊径地提高程序运行效率就是使用线程,充分利用多核的优势。 Qt 中所有界面都是在 UI 线程中(也被称为主线程,就是执行了QApplication::exec()的线程),在这个线程中执行耗时的操作(比如那个循环),就会阻塞 UI 线程,从而让界面停止响应。 ///!!! Qt5 class Work...
Qt自定义事件,Qt线程应用
Qt自定义事件,Qt线程应用。
qt 使用select监听串口时主线程被阻塞
在QT中,另起一个线程读串口,使用select监听的,可是为什么主线程也被阻塞了呢?n代码如下:nnthread.hn```n #ifndef DISTANCE_SERIAL_PORT_Hn#define DISTANCE_SERIAL_PORT_Hnn#include nnclass Distance_serial_port : public QThreadnn Q_OBJECTnpublic:n explicit Distance_serial_port(QObject *parent = 0);n void run();n void run_once();n void setTermios(struct termios * pNewtio, int uBaudRate);n void gps_uart_init(int ttyFd,struct termios *oldtio,struct termios *newtio);n n;nn#endif // DISTANCE_SERIAL_PORT_Hnn```nthread.cppnn```n #include "distance_serial_port.h"n#include n#include n#include n#include n#include n#include n#include n#include nn#define BUF_LENGTH 6n#define DEV_NAME "/dev/tty"nnDistance_serial_port::Distance_serial_port(QObject *parent) :n QThread()nnclass CLASS_JULIn public:n CLASS_JULI(int f = -1):fd(f) n ~CLASS_JULI()n n close(fd);n n int fd;n;nCLASS_JULI dis_port_fds;nvoid Distance_serial_port::run()nn while(1)n n tryn run_once();n n catch(...)n std::cerr<<"distance serial port run throw exception!"<0);n while(1)n n timeout.tv_sec=1;n timeout.tv_usec=0;n FD_ZERO(&readfd);n FD_SET(dis_port_fds.fd,&readfd);n ///监控函数n ret=select(dis_port_fds.fd+1,&readfd,NULL,NULL,&timeout);nn if(ret == -1) //错误情况n n std::cout<<"error"<0) //返回值大于0 有数据到来n nn if(FD_ISSET(dis_port_fds.fd,&readfd))n n i=read(dis_port_fds.fd,buf_read,BUF_LENGTH);n std::cout<<"----------------------------------------"<c_cflag = uBaudRate | CS8 | CREAD | CLOCAL;n pNewtio->c_iflag = IGNPAR;n pNewtio->c_oflag = 0;n pNewtio->c_lflag = 0; //non ICANONnnn/*n *设置串口的波特率9600,并刷新使其立即生效n */nvoid Distance_serial_port::gps_uart_init(int ttyFd,struct termios *oldtio,struct termios *newtio)nn tcgetattr(ttyFd, oldtio); /* save current serial port settings */n setTermios(newtio, B115200);n tcflush(ttyFd, TCIFLUSH);n tcsetattr(ttyFd, TCSANOW, newtio);nnn```n调用方法nn```n dis_serial_prot = new Distance_serial_port();n dis_serial_prot->run();n```n为什么呢?难道在QT中不能使用select?nnn
Qt错误报告解决 我是Qt小白
![图片说明](https://img-ask.csdn.net/upload/201609/28/1475039132_569637.png)
QT creator的小白问题
在Ubuntu-8.10上装了qt designer,发现运行起来跟网上的教程不一样。rnrn1.我运行的是qt creator,是这个吗?rnrn2.qt creator里新建一个qt4 gui application,在画板上放一个lineText,并将objectName 取为 testText,rnrn 旁边放个按钮,想通过这个按钮设置testText的值rnrn 按钮事件怎么写?rnrn testText -> setText(tr("test ok!"));rnrn 是这样吗? rnrn 编译时说testText未定义,请问要怎么实现呢?
iOS Qt 子线程与主线程通讯
iOS Qt 子线程与主线程通讯
Qt主线程与次线程通信实例代码
Qt主线程与次线程通信实例代码,方便大家学习下载使用!
JUC--AQS源码分析(三)阻塞和唤醒线程
1 概述 上一篇文章 JUC--AQS源码分析(二)同步状态的获取与释放,我们学习到了同步状态的获取与释放的源码,并且对线程的阻塞和唤醒有了一个初步的了解,这里我们进行深一步的分析。 2 阻塞 我们知道在获取线程同步状态失败的时候,会将线程加入到CLH同步队列,并且进行自旋等待。而在自旋等待方法acquireQueued中我们可以看见需要再次进行获取同步状态,如果获取同步状态失败则需要判断当...
Java线程--LockSupport阻塞/唤醒工具类
LockSupport线程阻塞/唤醒工具类 目录 LockSupport线程阻塞/唤醒工具类 LockSupport原理  LockSupport示例 LockSupport原理  LockSupport类,是个工具类。内部的实现是调用sun.misc.Unsafe(rt.jar包中)这个native本地类中的方法实现的,Unsafe本地类是用C++写的。可以说concurre...
Java中的AQS(三)线程的阻塞和唤醒
一、线程的阻塞:        在上一篇说到,线程获取同步状态失败的线程,会构造节点并加入到同步队列的尾部,然后通过自旋的方式不断的获取同步状态,但是在自旋过程中需要判断线程是否需要阻塞,我们再一次看一下acquire方法。final boolean acquireQueued(final Node node, int arg) { boolean failed = true; t...
java 同步阻塞并唤醒指定线程
java 多线程 同步阻塞 唤醒
在 android 怎样唤醒 处于阻塞 状态的线程?
rn应用情景是这样的,我用ServerSocket 在一个线程中创建了Socket 用于accept 客户端的请求,当然这个socket和本地的IP地址做了绑定,但是本地的IP地址是DHCP动态获取的,有时候会改变的。所以问题就来了,我怎样让处于阻塞状态的线程(因为accept 会阻塞线程)唤醒,然后在使用此线程让ServerSocket在变化后的IP地址上绑定,然后再等待Client端的链接?rnrnrn请各位为 大侠 多多指教?
从JDK源码角度看线程的阻塞和唤醒
目前在Java语言层面能实现阻塞唤醒的方式一共有三种:suspend与resume组合、wait与notify组合、park与unpark组合。其中suspend与resume因为存在无法解决的竟态问题而被Java废弃,同样,wait与notify也存在竟态条件,wait必须在notify之前执行,假如一个线程先执行notify再执行wait将可能导致一个线程永远阻塞,如此一来,必须要提出另外一种
Qt新手提问
各位Qt高手,小弟的毕业论文要用到图形界面编程,有几个问题请教各位。rn 现在的arm9开发板已经移植了内核,编写了显示器等驱动。rn [color=#FF0000]如果要显示些东西,就要做图形界面编程?[/color]rn [color=#FF0000]如果要让显示器播放视频和浏览网页,是不是能用Qt编写浏览器和播放器啊?还是要移植某些现成的啊?[/color]rn 先谢过各位高手了~!rn
QT新手提问
版本: qtopia platform 4.3.0rnrn写helloworld时碰到一个SXE的错误rnrn代码:rn#include rnint main(int argc, char *argv[])rnrn QtopiaApplication app(argc, argv);rn return app.exec();rnrnrn编译错误rnERROR: sample1 does not have the required SXE symbols.rnPlease see the QSXE_APP_KEY documentation for details.rnHint: Type QSXE_APP_KEY into assistants index box.rnmake[1]: *** [sxe_test] Error 1rnmake[1]: Leaving directory `/root/test/sample1'rnmake: *** [all] Error 2rn
关于Qt:新手提问
学过java,看过Qt的代码,觉得挺好,挺干净的。想深入学习,但是在此之前,想请教几个问题:rnrnrn1.Qt开发商用软件是否允许,是否需要买什么许可证什么的?我知道wxwidget, Gtk+是完全免费 for all purpose。另外,关于Qt那些复杂的GNU PLA的,看不懂。rnrn2. 现在的Linux 主流桌面是Gnome, 不是KDE, 想问 Qt开发的能否在Gnome 下运行??效果如何?rnrn3. 请求Linux(Ubuntu版本) 下 推荐一个IDE,谢谢。rnrn
Qt新手提问~~~
open source的Qt是不是能用visual studio编译啊? 那我原来用vs编译好的工程能在qt里直接用吗?要怎么设置?
[提问]关于Qt/Embedded
我现在已经装上Qt/Embedded了,有几个问题想問一下rn1,使用的设计器是用qt-x11的designer呢还是qt/embedded的designer呢?可是qt/embedded的designer启动不了,怎么回事?rn2,如果最终实现在arm上运行的qt程序,需要哪几个步骤呢?望大牛指教,最好是举个简单的例子或者推荐篇文章也行啊
QT 提问的程序代码
QT 提问的程序代码 QT 提问的程序代码 QT 提问的程序代码 QT 提问的程序代码 QT 提问的程序代码
QT新手 提问。
[color=#FF0000]Dialog d;rn QWidget *u = new QWidget();rn d.setParent(u);rn d.show();rn u->show();[/color]rnrn 把d设成u的子窗口,怎么d就看不见了,只能看见u了。
qt信号阻塞blockSignals的运用
void blockSignals ( bool block ) 如果block为真,阻塞信号,或者如果block为假,取消信号阻塞。 如果信号被阻塞,被发射的信号消失在超空间。 实例: void Rot13::changeLeft() { left->blockSignals( TRUE ); left->setText( rot13( right->text
Qt阻塞延时和非阻塞延时
非阻塞延时:void MyTool::delaymsec(int msec) { QTime dieTime = QTime::currentTime().addMSecs(msec); while (QTime::currentTime() < dieTime) QCoreApplication::processEvents(QEventLoop::AllEvent
QT线程间阻塞通信
最近在研究QT线程间同步问题,遇到了如下问题:rn启动一个界面线程uiThread和一个工作线程workThreadrn因为工作线程中不能弹出对话框,但是在遇到问题的时候需要进行弹窗提示,于是想使用uiThread来进行弹窗。rn1.使用信号和槽:如果使用QueuedConnection和AutoConnection都可以实现让uiThread弹窗,但是这样做的问题是弹窗的时候线程还是在执行,希望他能够停下来等待用户指令。于是尝试使用DirectConnection,当workThread向uiThread发送信号的时候就崩溃了。rn2.信号和槽不行了,于是想到事件机制,同样的,使用postEvent可以在两个线程之间发送事件,但是不能阻塞,使用sendEvent直接崩溃,提示不能向属于其他线程的对象发送信号。rnrn请问各位大神有什么方法能够实现两个线程之间的阻塞通信?
qt 信号阻塞 和 断开信号槽
Qt程序中有时候不希望信号槽的触发,在某段流程结束之后,又需要继续回复信号槽状态,这时候可以用阻塞或者断开信号槽的方法来处理。1. 阻塞方法:bool QObject::blockSignals(bool block)qt描述:阻塞模式下,这个对象发送的信号都会被阻塞,解除阻塞后则不再阻塞。返回值为之前状态的阻塞情况。If block is true, signals emitted by thi...
相关热词 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池 c#5.0 安装程序 c# 分页算法