1.问题:不将软件作为当前活动应用程序或者进入到屏保模式,软件定时器不按照指定间隔执行对应的槽函数导致。
2.环境:MacOS系统
3.原因
2013年,App Nap加入到MacOS系统,该机制主要是阻止非活动应用程序使用CPU和其他系统资源,节省电能消耗(省电)。App Nap 是一项 macOS 省电功能,可减少后台应用程序的 CPU 时间。 这样做的一个影响是计时器不再是及时的。
4.解决方案,关闭App Nap机制
4.1 关闭整个系统的App Nap机制
//启用/禁用App Nap
defaults write NSGlobalDomain NSAppSleepDisabled -bool YES
defaults delete NSGlobalDomain NSAppSleepDisabled
4.2 关闭单个软件的App Nap机制
(1)建个头文件appnap.h
//appnap.h
#include "qglobal.h"
#import <objc/objc.h>
class AppNapDisabler
{
public: AppNapDisabler();
~AppNapDisabler();
AppNapDisabler(const AppNapDisabler&) = delete;
AppNapDisabler& operator=(const AppNapDisabler&) = delete;
private: id m_activity;
};
(2) 建个objc文件appnap.mm
//appnap.mm
#include "appnap.h"
#import <AppKit/AppKit.h>
AppNapDisabler::AppNapDisabler()
{
m_activity = [[NSProcessInfo processInfo] beginActivityWithOptions:NSActivityBackground
reason:@"Qt Auto Test"];
[m_activity retain];
}
AppNapDisabler::~AppNapDisabler()
{
[[NSProcessInfo processInfo] endActivity:m_activity];
[m_activity release];
}
(3)在Qt项目配置(.pro)文件中加入下面这行
OBJECTIVE_SOURCES += appnap.mm
并将appnap.mm在另一个变量SOURCES中去除(建文件时会自动加在里面)
(4)在main函数中加入
AppNapDisabler appNap;
参考:
关于在macOS上运行Qt窗口程序遇到的坑_chexiaohui6306的博客-CSDN博客
如何解决c++编程中,(Qt::Timer)在macOS环境中,最小化窗口后一段时间就自动停止的问题? - 知乎