例程如下:主程序中,
全局变量
int Start=0;
HANDLE ToKillScanLanHandle;
HANDLE NewhEvent;//自动事件                    自动   无信号 事件名
NewhEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
启动一线程CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(ReadyToKillHandle),NULL,0,&dw);
DWORD WINAPI ReadyToKillHandle(LPVOID code)
{

again:
WaitForSingleObject(NewhEvent,INFINITE); Sleep(3);
if(ToKillHandle!=NULL)
CloseHandle(ToKillScanLanHandle); goto again;
}定义一定时器
timeSetEvent(100,1,(LPTIMECALLBACK)TimerCallProc,0,TIME_PERIODIC|TIME_CALLBACK_FUNCTION);
void CALLBACK TimerCallProc(UINT uTimerID, UINT uTimerMsg, DWORD dwTimerPointer,DWORD dwReserved1, DWORD dwReserved2)
{
DWORD ID=0;
ToKillHandle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Scan_1),(void*)&Start,0,&ID);
Start+=1;}
void Scan_1(void *p)
{
DWORD ID=0;
HANDLE h_scan; h_scan=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Scan_2),(void*)&number,0,&ID);
WaitForSingleObject(h_scan,25);//WAIT_OBJECT_0)
CloseHandle(h_scan);  SetEvent(NewhEvent); _endthread(); return;
}
void Scan_2(void *p){ Sleep(5000);
_endthread(); return;}程序看起来什么问题都没有,为什么运行时只要不打开其它窗口,本程序的句柄不会增加,但一旦打开其它进程,如IE,句柄数会越来越多呢

解决方案 »

  1.   

    ToKillScanLanHandle
    只看到关闭,没看到打开
      

  2.   

    对不起,上面有句错了ToKillScanLanHandle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Scan_1),(void*)&Start,0,&ID);
    但我估计是CreateThread这个函数的问题
      

  3.   

    The thread object remains in the system until the thread has terminated and all handles to it are closed through a call to CloseHandle. 
    定时器里创建线程,没有CloseHandle.
      

  4.   


    不想在定时器里关闭,在
    DWORD WINAPI ReadyToKillHandle(LPVOID code)
    {again:
    WaitForSingleObject(NewhEvent,INFINITE);Sleep(3); 
    if(ToKillHandle!=NULL)
    CloseHandle(ToKillScanLanHandle);goto again;
    }
      

  5.   

    again:
    WaitForSingleObject(NewhEvent,INFINITE);Sleep(3);
    if(ToKillHandle!=NULL)
    CloseHandle(ToKillScanLanHandle);goto again;
    为什么不用循环,用goto? 
      

  6.   

    在这种情况下,用循环和goto一样
      

  7.   

    WaitForSingleObject(h_scan,25);//WAIT_OBJECT_0) 改成:WaitForSingleObject(h_scan,INFINITE);试试
      

  8.   

    问题出在同步上,
    CloseHandle(ToKillHandle);
    此ToKillHandle的值并不一定是
    ToKillHandle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Scan_1),(void*)&Start,0,&ID);的值这就难了,这两个线程根本无法保证ToKillHandle的值是一致的