关于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函数立即返回。
...全文
1614 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,虽然二者不一样,不过对于线程操作也会有用

456

社区成员

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

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