优化手表的代码

时间:2010-03-07 20:51:15

标签: language-agnostic

我想实现一个代码来监视某些事件...同时我没有任何内置的eventwatcher所以我实现了我的一个...它消耗最少的cpu&存储器中。

你可以建议我一个......

例如给出伪代码:

while(true)
{
    if(process.isrunning)
        process.kill();
}

3 个答案:

答案 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)

尽管您已将此标记为与语言无关,但任何良好的实现方式都会有很大差异,不仅仅是从一种语言到另一种语言,而是跨操作系统。在很多情况下,程序或操作系统函数需要做这种事情,并且已经实现了以尽可能合理,非侵入的方式执行此操作的机制。

如果您有特定的语言和/或操作系统,请告诉我们,让我们更好地了解您要实现的目标。这样我们就可以指出最合适的解决方案。