关于QThread::wait(msec)函数的讨论

weixin_38055888 2019-09-19 02:06:40
之前再回帖时候提到线程中的wait函数,文档中是这样描述的bool QThread::wait ( unsigned long time = ULONG_MAX )Blocks the thread until either of these conditions is met:-The thread associated with this QThread object has finished execution (i.e. when it returns from run()). This function will return true if the thread has finished. It also returns true if the thread has not been started yet.-time milliseconds has elapsed. If time is ULONG_MAX (the default), then the wait will never timeout (the thread must return from run()). This function will return false if the wait timed out.This provides similar functionality to the POSIX pthread_join() function.大概意思是:这个函数阻塞线程直到满足下面的条件之一- 与这个线程对象关联的线程已经结束执行(例如从run函数返回)。如果线程结束返回真值。如果线程还没有开始也返回真值- 到达定时结束时刻。如果定时是ULONG_MAX (默认值),线程就会一直等下去(线程必须从run函数返回)。时间到,函数返回假值这个函数提供了跟POSIX系统上的 pthread_join()很相似的功能。原贴本来是问sleep函数的,因为是静态保护函数,所以我推荐用wait函数。另外我做了一些测试,大致过程如下:测试环境:vista+qt4.5.2+vc2008sp1+qt-vs-integration1.4.31.在vc中创建qt工程2.加入MyThread类,继承至QThread,实现run函数,一个无限循环打印函数3.主窗口加入3个按钮,相应的类中加入一个MyThread指针变量mythread,在构造函数中new一个MyThread4.三个按钮的鼠标单击事件分别调用mythread->start(QThread::LowPriority), thread->wait(10000)和thread->terminate()用来启动,暂停十秒和终止线程的功能测试的时候发现一个问题,wait函数虽然能够阻塞指定的时间,但是在阻塞期间,主窗口无法响应而子线程的打印依然在进行,直到时间到,主窗口才恢复响应,这里不明白到底是子线程被阻塞还是主线程被阻塞了?按照我的理解应该是mythread停止打印10秒钟才对。还是说打印的功能反应太慢了,我看到的打印数据是在调用wait之前的呢?最迷惑的还是主窗口怎么在这期间没有反应呢?尽管我启动线程的时候使用了较低的优先级别。有高手希望这里能给解释一下,多谢了!顺便提示一下那位网友,你在main函数中通过调用静态函数QThread::currentThread()->wait(10000)来对主线程测试是达不到你想要的结果的,wait函数立即返回。
...全文
2049 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38072696 2019-09-19
  • 打赏
  • 举报
回复
没有人遇到这种情况吗?
weixin_38082021 2019-09-19
  • 打赏
  • 举报
回复
文档说的不太清楚,实际上这个wait是在主线程里调用的, block的是主线程。。如果block子线程的话第一个条件就永远都不可能满足了呵呵
weixin_38088446 2019-09-19
  • 打赏
  • 举报
回复
引用第2楼shiroki于2009-07-13 17:05发表的  :文档说的不太清楚,实际上这个wait是在主线程里调用的, block的是主线程。。如果block子线程的话第一个条件就永远都不可能满足了呵呵多谢版总,测试的结果也显示了,这个函数是在主线程中被调用的时候阻塞了主线程。看来如果想在外部让子线程暂停,最好的办法是在子线程中设置一个标志,在主线程中更改这个标志,并在子线程的run函数中判断,通过调用其保护函数sleep来达到暂停的目的了。不知道各位是否还有其他更好的方法?
weixin_38098649 2019-09-19
  • 打赏
  • 举报
回复
引用第2楼shiroki于2009-07-13 17:05发表的  :文档说的不太清楚,实际上这个wait是在主线程里调用的, block的是主线程。。如果block子线程的话第一个条件就永远都不可能满足了呵呵这个函数的定义说也奇怪,调用自己,却是让别人去等待
weixin_38110193 2019-09-19
  • 打赏
  • 举报
回复
肯定是自己等待子线程,让子线程等待就是sleep()啊.对应pthread_join()可知这是等待和子线程汇合。所以wait()能实现让本线程休眠的功能,这个还是不错的。也谢谢楼主的实验。我真羡慕你的平台,我的三个版本都比你低,所以我马上麻烦了,多线程调试。
weixin_38115273 2019-09-19
  • 打赏
  • 举报
回复
引用第3楼sbtree于2009-07-13 20:57发表的  :多谢版总,测试的结果也显示了,这个函数是在主线程中被调用的时候阻塞了主线程。看来如果想在外部让子线程暂停,最好的办法是在子线程中设置一个标志,在主线程中更改这个标志,并在子线程的run函数中判断,通过调用其保护函数sleep来达到暂停的目的了。不知道各位是否还有其他更好的方法?这个就是这么干的,demo中有一个例子,就是演示了这个问题:Mandelbrot
weixin_38116075 2019-09-19
  • 打赏
  • 举报
回复
引用楼主sbtree于2009-07-10 23:53发表的 关于QThread::wait(msec)函数的讨论 :之前再回帖时候提到线程中的wait函数,文档中是这样描述的bool QThread::wait ( unsigned long time = ULONG_MAX )Blocks the thread until either of these conditions is met:.......顺便提示一下那位网友,你在main函数中通过调用静态函数QThread::currentThread()->wait(10000)来对主线程测试是达不到你想要的结果的,wait函数立即返回。你确定这个wait()没等待就出来了?
weixin_38126921 2019-09-19
  • 打赏
  • 举报
回复
不能等待自己,这个是用来多个线程交互的,所以不能当sleep()用。bool QThread::wait(unsigned long time){    Q_D(QThread);    QMutexLocker locker(&d->mutex);    if (d->id == GetCurrentThreadId()) {        qWarning("QThread::wait: Thread tried to wait on itself");        return false;    }    if (d->finished || !d->running)        return true;    ++d->waiters;    locker.mutex()->unlock();    bool ret = false;    switch (WaitForSingleObject(d->handle, time)) {    case WAIT_OBJECT_0:        ret = true;        break;    case WAIT_FAILED:        qErrnoWarning("QThread::wait: Thread wait failure");        break;    case WAIT_ABANDONED:    case WAIT_TIMEOUT:    default:        break;    }    locker.mutex()->lock();    --d->waiters;    if (ret && !d->finished) {        // thread was terminated by someone else        d->terminated = true;        QThreadPrivate::finish(this, false);    }    if (d->finished && !d->waiters) {        CloseHandle(d->handle);        d->handle = 0;    }    return ret;}
weixin_38133531 2019-09-19
  • 打赏
  • 举报
回复
看不懂,,那也得顶个  `
weixin_38151083 2019-09-19
  • 打赏
  • 举报
回复
说到wait(),想起了QWaitCondition,虽然二者不一样,不过对于线程操作也会有用
源码链接: https://pan.quark.cn/s/4059260b3dc9 在电子设计自动化(EDA)范畴内,Verilog作为一项关键的硬件描述语言(HDL),被普遍应用于构建数字系统的模型,其应用范围涵盖从基础的逻辑门构造到高级的系统级设计,例如本案例所探讨的电梯系统。运用Verilog进行的电梯系统构建是一个典型的综合实践任务,它融合了数字逻辑、嵌入式系统以及计算机工程等多个核心知识领域。 我们必须明确电梯系统的功能要求。电梯需依据乘客的楼层指令,智能地选择其运行路径、选择停靠的楼层以及安排门的开启流程。这一过程涉及到状态机的设计,这是Verilog编程中的一个核心概念。状态机能够将电梯的操作流程划分为多个独立的状态,例如待机、上行、下行、开门、关门等,通过状态间的转换条件来执行各类操作。 Verilog程序通常由多个模块构成,每个模块对应电路的一部分。在此项目中,可能包含以下模块:主控制单元模块、楼层识别模块、按键输入单元模块、电机驱动模块等。各模块均具备特定的功能,例如主控制单元负责统筹各部分的工作,而电机驱动模块则依据指令操控电梯的升降动作。 在构建电梯系统时,还需关注实时性和同步性。例如,电梯不允许在两个楼层同时开启门,这需要在Verilog程序中运用适当的同步手段,例如边沿触发的时钟信号,以确保数据传输的精确性与统一性。 接下来是仿真环节和验证步骤。借助ModelSim或Vivado这类软件工具,我们可以对Verilog程序进行仿真,模拟电梯的操作情形,考察其在不同情境下的表现是否符合设计预期。此步骤极为关键,有助于识别并修正设计中的缺陷。 倘若设计满足所有条件,可将Verilog程序编译并上传至FPGA(现场可编程门阵列)进行硬件层...

479

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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