- 浏览: 763533 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
sleep()//秒
msleep()//毫秒
usleep()//微秒
以前为了模拟鼠标点击用过这些函数,可以让进程中断,今天发现我原来的做法其实不对.
这组函数会将你当前的线程/进程变为“睡眠”状态。 这个“睡眠”是深度意义的睡眠, 睡眠期间内核不会分配给程序时间片, 所以程序什么都不做, 更不用提界面的刷新了。 直接导致的问题就是用户无法与程序交互。 所以说直接使用sleep函数睡眠是常见的错误方案之一。
另外一种更常见的错误方法是使用QTimer+死循环。 类似下面的代码:
QTimer t;
t.start();
while(t.elapsed() < 250);
这个简单粗暴的解决方案也是行不通的。 从代码中我们可以发现在while循环中不停的调用elapsed()函数, 等于在这段时间内CPU完全没有机会做别的什么事情。 特别是在Linux这样非抢占式的操作系统中, 这样的死循环造成的影响是致命的, CPU被完全占用, 内核都没有机会调度进程, 别的程序拿不到时间片执行, 系统基本上就是瘫痪状态了。 无论如何, 这种结果都不是我们想要的。(当然拉, 除非你想写的是病毒程序。) 对于我们的程序本身, 虽然它占用了所有的CPU, 但由于它陷入该循环, 程序没有机会进入到GUI事件循环, 导致同样界面是无法刷新的。
其实把上面的代码稍加改变就能得到一个很好的解决方案。 第一步, 解决界面无法刷新的问题。 调用QCoreApplication::processEvents(), 代码如下:
QTimer t;
t.start();
while(t.elapsed() < 250)
{
QCoreApplication::processEvents();
}
第二步, 解决程序CPU占用率过高的问题 -- 让程序适当睡眠。
QTimer t;
t.start();
while(t.elapsed() < 250)
{
QCoreApplication::processEvents();
usleep(10000);//sleep和usleep都已经obsolete,Linux下也可以使用nanosleep代替
}
以后要用,就可以直接用上面的代码了,用usleep()就可以了,那个nanosleep()则是Linux中的系统调用,它是使用定时器来实现的,该调用使调用进程睡眠,并往定时器队列上加入一个timer_list型定时器,time_list结构里包括唤醒时间以及唤醒后执行的函数,通过nanosleep()加入的定时器的执行函数仅仅完成唤醒当前进程的功能。系统通过一定的机制定时检查这些队列(比如通过系统调用陷入核心后,从核心返回用户态前,要检查当前进程的时间片是否已经耗尽,如果是则调用 schedule()函数重新调度,该函数中就会检查定时器队列,另外慢中断返回前也会做此检查),如果定时时间已超过,则执行定时器指定的函数唤醒调用进程。当然,由于系统时间片可能丢失,所以nanosleep()精度也不是很高。
msleep()//毫秒
usleep()//微秒
以前为了模拟鼠标点击用过这些函数,可以让进程中断,今天发现我原来的做法其实不对.
这组函数会将你当前的线程/进程变为“睡眠”状态。 这个“睡眠”是深度意义的睡眠, 睡眠期间内核不会分配给程序时间片, 所以程序什么都不做, 更不用提界面的刷新了。 直接导致的问题就是用户无法与程序交互。 所以说直接使用sleep函数睡眠是常见的错误方案之一。
另外一种更常见的错误方法是使用QTimer+死循环。 类似下面的代码:
QTimer t;
t.start();
while(t.elapsed() < 250);
这个简单粗暴的解决方案也是行不通的。 从代码中我们可以发现在while循环中不停的调用elapsed()函数, 等于在这段时间内CPU完全没有机会做别的什么事情。 特别是在Linux这样非抢占式的操作系统中, 这样的死循环造成的影响是致命的, CPU被完全占用, 内核都没有机会调度进程, 别的程序拿不到时间片执行, 系统基本上就是瘫痪状态了。 无论如何, 这种结果都不是我们想要的。(当然拉, 除非你想写的是病毒程序。) 对于我们的程序本身, 虽然它占用了所有的CPU, 但由于它陷入该循环, 程序没有机会进入到GUI事件循环, 导致同样界面是无法刷新的。
其实把上面的代码稍加改变就能得到一个很好的解决方案。 第一步, 解决界面无法刷新的问题。 调用QCoreApplication::processEvents(), 代码如下:
QTimer t;
t.start();
while(t.elapsed() < 250)
{
QCoreApplication::processEvents();
}
第二步, 解决程序CPU占用率过高的问题 -- 让程序适当睡眠。
QTimer t;
t.start();
while(t.elapsed() < 250)
{
QCoreApplication::processEvents();
usleep(10000);//sleep和usleep都已经obsolete,Linux下也可以使用nanosleep代替
}
以后要用,就可以直接用上面的代码了,用usleep()就可以了,那个nanosleep()则是Linux中的系统调用,它是使用定时器来实现的,该调用使调用进程睡眠,并往定时器队列上加入一个timer_list型定时器,time_list结构里包括唤醒时间以及唤醒后执行的函数,通过nanosleep()加入的定时器的执行函数仅仅完成唤醒当前进程的功能。系统通过一定的机制定时检查这些队列(比如通过系统调用陷入核心后,从核心返回用户态前,要检查当前进程的时间片是否已经耗尽,如果是则调用 schedule()函数重新调度,该函数中就会检查定时器队列,另外慢中断返回前也会做此检查),如果定时时间已超过,则执行定时器指定的函数唤醒调用进程。当然,由于系统时间片可能丢失,所以nanosleep()精度也不是很高。
发表评论
-
mac无法debug
2019-09-23 17:36 253升级新的lldb,底层脚本用的py3,而qtcreator暂不 ... -
现有项目生成pro文件
2018-07-21 15:32 1277qmake -project -
QtCreator使用arm编译器
2014-04-18 16:19 1222构建工具链各种不和谐,心一狠,直接改最原始的配置文件 1.首 ... -
qtcreator c++11
2013-07-15 22:10 1383在.pro里面:QMAKE_CXXFLAGS += -std= ... -
qt webkit
2013-03-28 17:27 815arora是一个很不错的开源的浏览器,我说它不错并不见得它的性 ... -
qt profile
2012-05-29 17:04 5380这篇文章是我从360doc上转的,本来是要把转的url列出来的 ... -
QtConcurrent
2012-05-26 14:48 2017当我们想在一个或多个辅助线程执行的同时做一些后台处理且无须使用 ... -
QThreadPool
2012-05-23 22:24 2199#include<QThreadPool> ... -
用qtcreator但不用qt库
2012-04-17 10:48 1311pro file: QT -= core gui -
qtcreator缺少编码
2012-04-14 13:46 874将plugins/codecs复制到yourcreator/b ... -
QTableView显示tooltip与设置日志
2012-01-11 22:15 3669原文http://www.cppblog.com/biao/a ... -
Qt mysql相关
2011-11-28 23:44 1790sudo apt-get install mysql-serv ... -
Qt自定义事件
2011-08-31 14:48 5308先看下官方的文档:(google translation) Q ... -
QComboBox下拉item变灰
2011-07-21 10:10 1938qobject_cast<QStandardItemMo ... -
Qt国际化
2011-07-21 09:37 9671.先在.pro中加入一行:TRANSLATIONS = xx ... -
Qt读写xml
2011-07-20 10:49 6460test.xml <?xml version=&qu ... -
Qt多线程
2011-07-18 21:08 1452Qt中线程安全的类有QMutex,QMutexLocker,Q ... -
生产者与消费者
2011-07-16 09:42 2#include<iostream> #in ... -
Qt读写二进制文件
2011-07-11 22:11 5677DataStream.h #ifndef DATASTRE ... -
QItemDelegate
2011-07-09 10:57 1886.h #ifndef DIALOG_H #define ...
相关推荐
在Windows系统开发中,Qt框架是一个非常流行的C++库,它提供了一整套工具和功能,使得开发者可以方便地创建跨平台的图形用户界面应用程序。当我们谈论“Qt Windows 休眠唤醒信号”时,我们主要关注的是如何在Windows...
本文将深入探讨如何使用Qt框架创建一个带有进度条的启动界面,为用户提供更加直观的程序加载进度反馈。 Qt是一个跨平台的C++图形用户界面库,它提供了丰富的API和工具,便于开发者构建桌面、移动甚至嵌入式设备的...
sleep 2 # 重新启动程序 your_program_name ``` 然后,在QT程序中,你可以这样使用`QProcess`: ```cpp #include void restartProgram() { QProcess process; process.start("/path/to/your/restart.sh"); } `...
在QT编程中,控制台应用(Console Application)是常见的开发场景,它允许程序员在命令行环境中执行程序。本文将深入探讨如何在QT控制台中利用Windows API中的`GetAsyncKeyState`函数来实时获取键盘输入的响应。`...
例如,`echo "* * * * * sleep 600 && path_to_your_executable >> log_file.txt 2>&1"`将程序设置为开机10分钟后运行,并将输出重定向到日志文件。 4. **Qt定时器实现延迟启动** 如果不希望借助系统任务计划,Qt...
在Qt中,可以使用`QThread::sleep()`或`QThread::msleep()`来实现阻塞延时。例如,`Delay_MSec_Suspend`方法是一种简单的阻塞延时实现: ```cpp void QSleepTimeSet::Delay_MSec_Suspend(unsigned int msec) { ...
- 在`checkUsbDevices()`函数中,确保使用`QThread::sleep()`或`QEventLoop::processEvents()`避免阻塞主线程。 - 在槽函数中,使用Qt的`QProcess`或者封装Windows API调用来执行上述步骤。 5. **UI设计**: - ...
QThread::sleep(1); // 防止CPU占用过高,可调整睡眠时间 } ``` 此外,为了在QT界面中展示接收到的数据,你可以创建一个文本框或表格控件,并将数据实时更新到界面上。这可能涉及到信号和槽机制,例如当接收到新的...
QThread::sleep(1); // 延迟1秒,模拟加载时间 } MainWindow mainWindow; mainWindow.show(); splash.finish(&mainWindow); // 关闭启动界面并显示主窗口 return app.exec(); } ``` 4. **资源文件**:如果...
QThread::sleep(1); // 防止阻塞主线程 } std::string output = process.readAllStandardOutput().toStdString(); std::string error = process.readAllStandardError().toStdString(); ``` 4. 关闭连接:当完成...
Qt提供了一些工具,如qDebug()、QThread::currentThreadId()和QThread::sleep(),帮助你跟踪线程执行情况,定位和解决问题。 综上所述,Qt5中的串口通信和线程管理是通过QSerialPort和QThread类实现的。合理封装...
QThread::sleep(1); } // 停止连续抓拍 disconnect(imageCapture, nullptr, this, nullptr); ``` 在实际项目中,`QtCameraDemo`可能是一个包含上述功能的完整示例,它展示了如何将这些概念整合到一个应用程序中。...
例如,你可以使用`boost::thread`创建新的线程,用`boost::mutex`进行线程同步,或者使用`boost::this_thread::sleep`进行延时操作。 在Qt与Boost的结合中,另一个常见用途是使用Boost.Asio进行网络编程。Asio提供...
sleep %2") .arg(frequency > 0 ? "1" : "0") .arg(GPIO_PIN_FOR_BUZZER) .arg(durationMs / 1000.0)}); process.waitForFinished(); } ``` 这里假设你已经配置好GPIO,并且`GPIO_PIN_FOR_BUZZER`变量存储了...
QThread::sleep(1); // 模拟延迟 } return app.exec(); } ``` 以上就是关于Qt进度条QProgressBar的基本使用和常见操作。通过理解这些知识点,你将能够轻松地在自己的项目中实现进度条功能,提高用户界面的互动...
在本主题中,我们将探讨如何将Box2D集成到Qt应用程序中,为你的项目添加真实的物理效果。Qt是一个功能强大的C++框架,用于创建跨平台的桌面和移动应用程序。 集成Box2D到Qt的第一步是获取Box2D库。Box2D通常以C++源...
QThread::sleep(1); // 模拟耗时操作 } } ``` **用户界面的响应性** 在Qt中,所有的GUI更新都应该在主线程中进行。因此,即使在`MyThread`中打印数字,也应确保这些更新是安全的。这可以通过发射一个信号到主线...
- 等待10秒以确保Qvfb启动完成:`sleep 10` - 运行示例:`./launcher –qws` #### 六、QT移植到ARM开发板 完成上述步骤后,可以将QT移植到目标ARM开发板上。 1. **配置Qt/Embedded** - 进入Qt/Embedded目录:`...