QWaitCondition Class Reference
[QtCore module]

该类提供一个情况变量来同步线程。
#include <QWaitCondition>
注意:该类所有的函数是线程安全的。
公共函数:
 
bool
wait ( QMutex * mutex, unsigned long time = ULONG_MAX )
bool
wait ( QReadWriteLock * readWriteLock, unsigned long time = ULONG_MAX )
void
void
详细描述:
该类允许一个线程来告诉其他线程一些种情况已经被遇到。一个或者多个线程能阻塞等待为一个QWaitCondition来设置一个情况用wakeOne()或wakeAll()。使用wakeOne()来随机唤醒一个被选择的情况或者wakeAll()来唤醒所有的。
例如,假定我们有三个任务,应该被执行,当使用者按下一个键。每个任务能被放入一个线程。每个都有一个run像这样:
forever {
     mutex.lock();
     keyPressed.wait(&mutex);
     do_something();
     mutex.unlock();
 }
这里keyPressed变量是一个全局的QWaitCondition
第四个线程将读键按下 和唤醒其他的三个线程,
forever {
     getchar();
     keyPressed.wakeAll();
 }
三个线程按顺序被唤醒时没有定义的。如果一些线程仍然在do_sth()当键被按下,他们将不被唤醒。所以任务将并不被执行。这种情况能被解决,通过使用一个counter和一个QMutex来保护她。例如:
forever {
     mutex.lock();
     keyPressed.wait(&mutex);
     ++count;
     mutex.unlock();
 
     do_something();
 
     mutex.lock();
     --count;
     mutex.unlock();
 }
下面是代码为第四个线程
forever {
     getchar();
 
     mutex.lock();
     // Sleep until there are no busy worker threads
     while (count > 0) {
         mutex.unlock();
         sleep(1);
         mutex.lock();
     }
     keyPressed.wakeAll();
     mutex.unlock();
 }
Mutex是必须的,因为两个线程的结果视图改变相同的变量的值。
等待情况是一个强大的原始线程同步。等待情况例子展示怎样使用QWaitCondition作为一个替代QSemaphore来控制进入一个循环buf被一个生产者线程和消费者线程。
成员函数文件

QWaitCondition::QWaitCondition ()

QWaitCondition::~QWaitCondition ()

bool QWaitCondition::wait ( QMutex * mutex, unsigned long time = ULONG_MAX )

释放锁定的mutex和等待waitCondition。Mutex必须被调用的线程原始锁定。如果mutex不是在一个锁定的状态,这个函数立即返回。如果mutex是一个递归的mutex,这个函数立即返回。Mutex将被解锁,调用线程将阻塞直到这些情况被遇到:
1.     另一个线程用wakeOne()或者wakeAll()发射信号。这个函数将返回true
2.     time超时。如果time是ulong_max(默认的),然后等待将绝不超时。这个函数将返回false,如果等待超时

bool QWaitCondition::wait ( QReadWriteLock * readWriteLock, unsigned long time = ULONG_MAX )

void QWaitCondition::wakeAll ()

唤醒所有在等待waitCondition的线程。唤醒的顺序依赖于操作系统的政策,不能被控制。

void QWaitCondition::wakeOne ()

唤醒一个线程,等待waitCondition的。线程的唤醒取决于操作系统的政策,不能被控制。
如果你想唤醒一个特别的线程,解决办法是使用不同的等待情况。
 
http://no001.blog.51cto.com/1142339/277010

最新文章

  1. 求解第N个素数
  2. C#进阶系列——WebApi 异常处理解决方案
  3. 【hbase】——Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
  4. hibernate save,update,saveorupdate方法有什么区别
  5. 数据库是.frm,.myd,myi备份如何导入mysql (转)
  6. 关于silverlight打印模糊的问题
  7. Jade之标签
  8. HDU 1142 A Walk Through the Forest (记忆化搜索 最短路)
  9. INSERT IGNORE 与 INSERT INTO的区别
  10. TCP/IP与UDP区别
  11. window.frameElement属性
  12. Python:2D画图库matplotlib学习总结
  13. .Net Core Identity外面使用Cookie中间件
  14. Linux - 简明Shell编程04 - 判断语句(If)
  15. Django编写RESTful API(三):基于类的视图
  16. 走进AngularJS
  17. [UWP]创建一个进度按钮
  18. 阿里云API网关(9)常见问题
  19. 排查Full GC
  20. 如何使用Apache log4net库与ASP.NET MVC 5日志记录

热门文章

  1. 如何在移动web模仿客户端给input输入框添加自定义清除按钮
  2. Javascript 获取页面高度(多种浏览器)
  3. ASP.Net WebAPI HttpDelete/PUT方法运行或发布到生产服务器上后出现405(Method Not Allowed)错误的解决办法
  4. SSH连接Linux的Server超时
  5. linux下Oracle11g RAC搭建(一)
  6. hadoop集群安装(多机,非伪集群)
  7. Redis的增删改查、持久化你会了吗
  8. Android Snackbar使用方法及小技巧-design
  9. 递归(c++)(转)
  10. 回顾Oracle几个用到的基本语句