我想实现一个代码来监视某些事件...同时我没有任何内置的eventwatcher所以我实现了我的一个...它消耗最少的cpu&存储器中。
你可以建议我一个......例如给出伪代码:
while(true)
{
if(process.isrunning)
process.kill();
}
答案 0 :(得分:1)
如果您没有任何要挂钩的事件,那么您的代码必须“有效”才能运行检查。这会花费CPU周期。
你可以做些什么来减轻浪费就是添加一个睡眠调用(.NET中的Thread.Sleep,在C ++的某些实现中睡眠)。
while (true) {
if(process.isrunning)
process.kill();
sleep(100); // Wait 100 millisecond before trying again
}
但这会让你的代码响应性降低一些。
答案 1 :(得分:0)
您可以尝试使用计时器队列:http://msdn.microsoft.com/en-us/library/ms687003%28VS.85%29.aspx它基本上使用内核调度程序以指定的时间间隔调用您的函数回调,调用者来自不同的线程,因此它不会中断主线程并使您的应用程序响应,该线程由Windows管理,因此您不必管理自己的池化线程,并且相对准确。
实施示例: `
//a singleton class that hold timer queue
class TimerQueue {
protected:
HANDLE timerQueue;
TimerQueue() {
this->timerQueue = ::CreateTimerQueue();
}
~TimerQueue() {
if(this->timerQueue) {
::DeleteTimerQueueEx(this->timerQueue,NULL);
this->timerQueue = NULL;
}
}
public:
static HANDLE getHandle() {
static TimerQueue timerQueueSingleton;
return timerQueueSingleton.timerQueue;
}
}
//timer base class
class Timer
{
protected:
HANDLE timer;
virtual void timerProc() = 0;
static void CALLBACK timerCallback(PVOID param,BOOLEAN timerOrWait) {
Timer* self = (Timer*)param;
self->timerProc();
}
public:
Timer(DWORD startTimeMs,DWORD periodTimeMs) {
if(!::CreateTimerQueueTimer( &this->timer, TimerQueue::getHandle(),
(WAITORTIMERCALLBACK)&this->timerCallback,
this, startTimeMs, periodTimeMs,
WT_EXECUTEDEFAULT) ) {
this->timer = NULL;
}
}
virtual ~Timer() {
if(this->timer) {
::DeleteTimerQueueTimer(TimerQueue::getHandle(),&this->timer,NULL);
this->timer = NULL;
}
}
}
//derive and implement timerProc
class MyTimer : public Timer
{
protected:
virtual void timerProc() {
if(process.isRunning()) {
process.kill();
}
}
public:
MyTimer(DWORD startTimeMs,DWORD periodTimeMs)
: Timer(startTimeMs,periodTimeMs) {}
}
//usage:
int main(int argc,char* argv[]) {
MyTimer timer(0,100); //start immediately, at 10 Hz interval
}
`
免责声明:我不测试或编译这些代码,你应该重新检查它答案 2 :(得分:0)
尽管您已将此标记为与语言无关,但任何良好的实现方式都会有很大差异,不仅仅是从一种语言到另一种语言,而是跨操作系统。在很多情况下,程序或操作系统函数需要做这种事情,并且已经实现了以尽可能合理,非侵入的方式执行此操作的机制。
如果您有特定的语言和/或操作系统,请告诉我们,让我们更好地了解您要实现的目标。这样我们就可以指出最合适的解决方案。