如何在C++;? 有没有一种方法可以从C++应用程序的源代码中禁用APP NAP?
我正在将clang编译器与cmake一起使用。提供了有关如何以及何时激活应用程序Nap的一些详细信息,并注意到可以使用该类来禁用它(特别是使用如何在C++;? 有没有一种方法可以从C++应用程序的源代码中禁用APP NAP?,c++,macos,C++,Macos,我正在将clang编译器与cmake一起使用。提供了有关如何以及何时激活应用程序Nap的一些详细信息,并注意到可以使用该类来禁用它(特别是使用beginActivityWithOptions:reason:) 对APP NAP没有任何C或C++接口。 < P>下面的RAII类,将从中修改,将执行。p> #if defined(__APPLE__) #if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1050 # include <objc/runtime.h
beginActivityWithOptions:reason:
)
对APP NAP没有任何C或C++接口。
< P>下面的RAII类,将从中修改,将执行。p>#if defined(__APPLE__)
#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1050
# include <objc/runtime.h>
# include <objc/message.h>
#else
# include <objc/objc-runtime.h>
#endif
#include <mutex>
namespace detail { struct LatencyCriticalLock {
int count = {};
id activity = {};
id processInfo = {};
id reason = {};
std::unique_lock<std::mutex> mutex_lock() {
init();
return std::unique_lock<std::mutex>(mutex);
}
private:
std::mutex mutex;
template <typename T> static T check(T i) {
return (i != nil) ? i : throw std::runtime_error("LatencyCrticalLock init() failed");
}
void init() {
if (processInfo != nil) return;
auto const NSProcessInfo = check(objc_getClass("NSProcessInfo"));
processInfo = check(objc_msgSend((id)NSProcessInfo, sel_getUid("processInfo")));
reason = check(objc_msgSend((id)objc_getClass("NSString"), sel_getUid("alloc")));
reason = check(objc_msgSend(reason, sel_getUid("initWithUTF8String:"), "LatencyCriticalLock"));
}
}; }
class LatencyCriticalLock {
static detail::LatencyCriticalLock d;
bool locked = {};
public:
struct NoLock {};
LatencyCriticalLock &operator=(const LatencyCriticalLock &) = delete;
LatencyCriticalLock(const LatencyCriticalLock &) = delete;
LatencyCriticalLock() { lock(); }
explicit LatencyCriticalLock(NoLock) {}
~LatencyCriticalLock() { unlock(); }
void lock() {
if (locked) return;
auto l = d.mutex_lock();
assert(d.count >= 0);
if (!d.count) {
assert(d.activity == nil);
/* Start activity that tells App Nap to mind its own business: */
/* NSActivityUserInitiatedAllowingIdleSystemSleep */
/* | NSActivityLatencyCritical */
d.activity = objc_msgSend(d.processInfo, sel_getUid("beginActivityWithOptions:reason:"),
0x00FFFFFFULL | 0xFF00000000ULL, d.reason);
assert(d.activity != nil);
}
d.count ++;
locked = true;
assert(d.count > 0 && locked);
}
void unlock() {
if (!locked) return;
auto l = d.mutex_lock();
assert(d.count > 0);
if (d.count == 1) {
assert(d.activity != nil);
objc_msgSend(d.processInfo, sel_getUid("endActivity:"), d.activity);
d.activity = nil;
locked = false;
}
d.count--;
assert(d.count > 0 || d.count == 0 && !locked);
}
bool isLocked() const { return locked; }
};
detail::LatencyCriticalLock LatencyCriticalLock::d;
#endif /* __APPLE__ */
#如果定义(uuu苹果公司)
#如果允许的MAC OS X版本大于等于1050
#包括
#包括
#否则
#包括
#恩迪夫
#包括
命名空间详细信息{struct LatencyCriticalLock{
整数计数={};
id活动={};
id processInfo={};
id原因={};
std::unique_lock mutex_lock(){
init();
返回std::唯一锁(互斥锁);
}
私人:
std::互斥互斥;
模板静态T检查(TI){
返回(i!=nil)?i:throw std::runtime_错误(“LatencyCrticalLock init()失败”);
}
void init(){
如果(processInfo!=nil)返回;
auto const NSProcessInfo=check(objc_getClass(“NSProcessInfo”);
processInfo=check(objc_msgSend((id)NSProcessInfo,sel_getUid(“processInfo”));
原因=检查(objc_msgSend((id)objc_getClass(“NSString”)、sel_getUid(“alloc”));
原因=检查(objc_msgSend(原因,sel_getUid(“initWithUTF8String:”),“latencycriticcallock”);
}
}; }
类LatencCriticCallock{
静态细节::LatencCriticallock d;
布尔锁定={};
公众:
结构NoLock{};
LatencyCriticalLock&运算符=(const LatencyCriticalLock&)=删除;
LatencyCriticalLock(const LatencyCriticalLock&)=删除;
LatencyCriticalLock(){lock();}
显式LatencCriticalLock(NoLock){}
~LatencyCriticalLock(){unlock();}
无效锁(){
如果(锁定)返回;
自动l=d.互斥锁();
断言(d.count>=0);
如果(!d.count){
断言(d.activity==nil);
/*启动活动,告知App Nap注意自己的事情:*/
/*NSACTIVITY系列启动低怠速系统LEEP*/
/*| NSACTIVITY关键*/
d、 activity=objc_msgSend(d.processInfo,sel_getUid(“beginactivitywhithoptions:reason:”),
0x00FFFFFFULL | 0xFF00000000ULL,d.原因);
断言(d.activity!=nil);
}
d、 计数++;
锁定=真;
断言(d.count>0&&locked);
}
无效解锁(){
如果(!锁定)返回;
自动l=d.互斥锁();
断言(d.count>0);
如果(d.count==1){
断言(d.activity!=nil);
objc_msgSend(d.processInfo,sel_getUid(“endActivity:”),d.activity);
d、 活动=零;
锁定=错误;
}
d、 计数--;
断言(d.count>0 | | d.count==0&&!已锁定);
}
bool isLocked()常量{return locked;}
};
细节::LatencyCriticalLock LatencyCriticalLock::d;
#endif/*.\uu苹果公司*/
如果使用Qt.io时遇到此问题,请参见以下内容: