`

Qt sleep

    博客分类:
  • Qt
阅读更多
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()精度也不是很高。
分享到:
评论

相关推荐

    Qt Windows 休眠唤醒信号

    在Windows系统开发中,Qt框架是一个非常流行的C++库,它提供了一整套工具和功能,使得开发者可以方便地创建跨平台的图形用户界面应用程序。当我们谈论“Qt Windows 休眠唤醒信号”时,我们主要关注的是如何在Windows...

    Qt带进度条的启动界面

    本文将深入探讨如何使用Qt框架创建一个带有进度条的启动界面,为用户提供更加直观的程序加载进度反馈。 Qt是一个跨平台的C++图形用户界面库,它提供了丰富的API和工具,便于开发者构建桌面、移动甚至嵌入式设备的...

    QT 程序 注销 重启

    sleep 2 # 重新启动程序 your_program_name ``` 然后,在QT程序中,你可以这样使用`QProcess`: ```cpp #include void restartProgram() { QProcess process; process.start("/path/to/your/restart.sh"); } `...

    QT控制台console用GetAsyncKeyState函数获取键盘响应

    在QT编程中,控制台应用(Console Application)是常见的开发场景,它允许程序员在命令行环境中执行程序。本文将深入探讨如何在QT控制台中利用Windows API中的`GetAsyncKeyState`函数来实时获取键盘输入的响应。`...

    Qt使用任务计划,根据电脑开机自动延迟启动软件

    例如,`echo "* * * * * sleep 600 && path_to_your_executable &gt;&gt; log_file.txt 2&gt;&1"`将程序设置为开机10分钟后运行,并将输出重定向到日志文件。 4. **Qt定时器实现延迟启动** 如果不希望借助系统任务计划,Qt...

    关于Qt中常用的延时方法--自我总结 - yanche521的专栏 - CSDN博客1

    在Qt中,可以使用`QThread::sleep()`或`QThread::msleep()`来实现阻塞延时。例如,`Delay_MSec_Suspend`方法是一种简单的阻塞延时实现: ```cpp void QSleepTimeSet::Delay_MSec_Suspend(unsigned int msec) { ...

    windows下qt监听 USB 插入/拔出

    - 在`checkUsbDevices()`函数中,确保使用`QThread::sleep()`或`QEventLoop::processEvents()`避免阻塞主线程。 - 在槽函数中,使用Qt的`QProcess`或者封装Windows API调用来执行上述步骤。 5. **UI设计**: - ...

    QT实现周立功CAN通信,自动接收数据

    QThread::sleep(1); // 防止CPU占用过高,可调整睡眠时间 } ``` 此外,为了在QT界面中展示接收到的数据,你可以创建一个文本框或表格控件,并将数据实时更新到界面上。这可能涉及到信号和槽机制,例如当接收到新的...

    QT写的启动界面

    QThread::sleep(1); // 延迟1秒,模拟加载时间 } MainWindow mainWindow; mainWindow.show(); splash.finish(&mainWindow); // 关闭启动界面并显示主窗口 return app.exec(); } ``` 4. **资源文件**:如果...

    ssh.rar_qt ssh_qtssh_qt中调用ssh_qt使用ssh_ssh qt

    QThread::sleep(1); // 防止阻塞主线程 } std::string output = process.readAllStandardOutput().toStdString(); std::string error = process.readAllStandardError().toStdString(); ``` 4. 关闭连接:当完成...

    Qt5串口线程

    Qt提供了一些工具,如qDebug()、QThread::currentThreadId()和QThread::sleep(),帮助你跟踪线程执行情况,定位和解决问题。 综上所述,Qt5中的串口通信和线程管理是通过QSerialPort和QThread类实现的。合理封装...

    Qt实现USB多摄像头的识别、显示、截图、分辨率帧率设置等功能源码

    QThread::sleep(1); } // 停止连续抓拍 disconnect(imageCapture, nullptr, this, nullptr); ``` 在实际项目中,`QtCameraDemo`可能是一个包含上述功能的完整示例,它展示了如何将这些概念整合到一个应用程序中。...

    qt使用boost工程模板

    例如,你可以使用`boost::thread`创建新的线程,用`boost::mutex`进行线程同步,或者使用`boost::this_thread::sleep`进行延时操作。 在Qt与Boost的结合中,另一个常见用途是使用Boost.Asio进行网络编程。Asio提供...

    用Qt控制开发板led和蜂鸣器

    sleep %2") .arg(frequency &gt; 0 ? "1" : "0") .arg(GPIO_PIN_FOR_BUZZER) .arg(durationMs / 1000.0)}); process.waitForFinished(); } ``` 这里假设你已经配置好GPIO,并且`GPIO_PIN_FOR_BUZZER`变量存储了...

    Qt进度条QProgressBar的使用(详细代码)

    QThread::sleep(1); // 模拟延迟 } return app.exec(); } ``` 以上就是关于Qt进度条QProgressBar的基本使用和常见操作。通过理解这些知识点,你将能够轻松地在自己的项目中实现进度条功能,提高用户界面的互动...

    Box2D:给你的Qt程序加上物理引擎(包含windows+linux版)

    在本主题中,我们将探讨如何将Box2D集成到Qt应用程序中,为你的项目添加真实的物理效果。Qt是一个功能强大的C++框架,用于创建跨平台的桌面和移动应用程序。 集成Box2D到Qt的第一步是获取Box2D库。Box2D通常以C++源...

    Qt 多线程简单实例

    QThread::sleep(1); // 模拟耗时操作 } } ``` **用户界面的响应性** 在Qt中,所有的GUI更新都应该在主线程中进行。因此,即使在`MyThread`中打印数字,也应确保这些更新是安全的。这可以通过发射一个信号到主线...

    基于AT91SAM9261 AT91SAM9263的QT移植

    - 等待10秒以确保Qvfb启动完成:`sleep 10` - 运行示例:`./launcher –qws` #### 六、QT移植到ARM开发板 完成上述步骤后,可以将QT移植到目标ARM开发板上。 1. **配置Qt/Embedded** - 进入Qt/Embedded目录:`...

Global site tag (gtag.js) - Google Analytics