Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C++;? 有没有一种方法可以从C++应用程序的源代码中禁用APP NAP?_C++_Macos - Fatal编程技术网

如何在C++;? 有没有一种方法可以从C++应用程序的源代码中禁用APP 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

我正在将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>
# 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时遇到此问题,请参见以下内容: