QWaitCondition解决打印日志卡的问题
来源:互联网 发布:云熙拆单软件正版价格 编辑:程序博客网 时间:2024/05/19 12:17
问题:为解决控制台程序日志界面打印管理服务器日志功能,我自己写了一个线程,采用队列的形式,但是对于什么时候发来日志,什么时候写日志,日志线程sleep多长时间,都不确定,而不sleep的话,线程若没有任务时就处于空转状态任务多时,频繁向日志界面增加日志,又会导致界面卡。
解决方案:在打印日志线程中,使用一个QWaitCondition。QWaitCondition提供了一个等待的条件。它允许一个线程告诉其他线程某个条件被满足了。从而其他线程开始执行任务。其他线程可以通过调用QWaitCondition的wait函数来阻塞自己,来等待某个条件,条件满足则线程开始执行,否则继续等待。等待的条件是锁。
这样,当加入任务时,线程就转一圈。没有加入任务时,线程就一直在等待,等待加入任务。从而就可以保证线程不空转,也可以保证能够及时的响应任务,执行任务。
代码如下:
QWaitCondition m_hasNewLog;
QMutex m_mutex;
QQueue m_logQueue;
void WriteLogThread::run()
{
while(!m_bStop)
{
m_mutex.lock();
m_hasNewLog.wait(&m_mutex);
while(m_logQueue.size()> 0)
{
QString tempLog = m_logQueue.dequeue();
emit sigWriteLog(tempLog);
}
m_mutex.unlock();
}
}
void WriteLogThread::insertLog(QStringlogStr)
{
m_mutex.lock();
m_logQueue.push_back(logStr);
m_hasNewLog.wakeAll();
m_mutex.unlock();
}
void WriteLogThread::stop()
{
m_mutex.lock();
m_bStop= true;
m_mutex.unlock();
}
此处,线程退出时,进行一次加锁,让线程转一下,并且把停止线程的变量m_bStop置为true,下一次循环时,循环条件不符合,线程退出。
详细的用法可以查看QT文档对QWaitCondition的介绍。
- QWaitCondition解决打印日志卡的问题
- QWaitCondition解决打印日志卡的问题
- ios解决xcode8打印日志乱码问题
- jenkins解决日志打印乱码问题
- brit打印日志的问题
- 解决打印一堆碍眼的日志问题 升级xcode8后出现的问题
- 关于android手机logcat无法打印日志的问题的解决
- 解决mybatis继承SqlSessionDaoSupport方式操作数据库不打印sql日志的问题。
- 解决MyBatis进行数据库操作时因参数过长导致打印日志过长的问题
- Qt的QWaitCondition
- Qt的QWaitCondition
- Qt QWaitCondition的应用
- QWaitCondition的用法
- Qt的QWaitCondition
- Qt的QWaitCondition
- QWaitCondition 的正确使用方法
- QWaitCondition
- QWaitCondition
- request
- 【JS】JavaScript引擎的内部运行机制
- 在线填写--关于时间的内容
- CDH 维护日志,集群查看
- Android-Sax解析与生成xml数据
- QWaitCondition解决打印日志卡的问题
- block回调的一点个人理解
- 给中国学生的第三封信:成功、自信、快乐
- Edit Distance
- 软工视频总结Part Three
- Objective-C中的浅拷贝和深拷贝
- SourceInsight 的一些小技巧
- android 学习笔记 将数据存储到SharedPreferences中 并且读取数据
- 原码反码补码 详解