首页 新闻 会员 周边

VC6如何实现在Console程序中建立一个Timer定时执行一段代码,不要阻塞主线程?

0
悬赏园豆:10 [已解决问题] 解决于 2013-10-10 09:40

我的需求是这样的,我有一个DLL,我要注入到一个进程里(比如:explore.exe),在目标进程里创建一个Timer来监测我的进程有没有被非法结束,如果被结束了,我就强制关机。我试了创建一个线程来做这件事,但发现目标进程会非常卡,但我用VB中的Timer来实现这样的功能就一点都不卡,几乎没有CPU上长的问题,我想知道正确写一个死循环的线程的方法。我的代码如下:

BOOL MonitorProcessFlag = true;

DWORD WINAPI MonitorProcess(LPVOID para)
{ 
    DWORD pid = (DWORD)para;
    while(true)
    {
        if(!MonitorProcessFlag)
            return 0;
        
        if(!IsProcessExists(pid))
        {
            Shutdown();
            return 0;
        }

        Sleep(1000);    
     }
}

int main(int argc, char* argv[])
{
    HANDLE three1;
    DWORD dwThreadId;
    three1=CreateThread(NULL,0,MonitorProcess,(LPVOID)651,0,&dwThreadId);

int key ; cin>>key; return 0; }
空明流光的主页 空明流光 | 初学一级 | 园豆:106
提问于:2013-10-09 20:17
< >
分享
最佳答案
0

可以在 Sleep(1000) 前或者后调用一次 YieldProcessor();

或者在MonitorProcess 中创建一个 Event或semaphore之类的同步对象,始终不激活,然后,把 Sleep(1000) 替换为 WaitForSingleObject(handle,1000 * 1000);

更好的做法是使用 Timer,如下:

VOID CALLBACK MonitorProcess(PVOID lpParam, BOOLEAN timerOrWaitFired);

HANDLE timerQueue = CreateTImerQueue();

HANDLE timer = NULL;

CreateTimerQueueTimer(&timer,timerQueue,MonitorProcess,stateObj,1000 * 1000,1000 * 10000,WT_EXECUTEDEFAULT);

收获园豆:10
Launcher | 高人七级 |园豆:45045 | 2013-10-10 09:23

谢谢高人指点。这个方法很有用。有时间的话再帮我看一下我的另一个博问,dllmain中如何创建一个不会随着dll卸载而结束的线程?谢谢!

空明流光 | 园豆:106 (初学一级) | 2013-10-10 09:40
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册