我的需求是这样的,我有一个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; }
可以在 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);
谢谢高人指点。这个方法很有用。有时间的话再帮我看一下我的另一个博问,dllmain中如何创建一个不会随着dll卸载而结束的线程?谢谢!