这两天问了几个问题到目前还无法获取满意答案,望大家帮忙原例程如下
主程序中,
全局变量
int Start=0;
HANDLE ToKillHandle; 
HANDLE NewhEvent;//自动事件 自动 无信号 事件名
NewhEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
//启动一线程,此线程是来关闭由  ToKillHandle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Scan_1),(void*)&Start,0,&ID)产生的句柄,何时closehandle由事件来决定
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(ToKillHandle);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;}
现在发现问题出在同步上,CloseHandle(ToKillHandle);
此ToKillHandle的值并不一定是
ToKillHandle=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Scan_1),(void*)&Start,0,&ID);的值这就难了,这两个线程根本无法保证ToKillHandle的值是一致的,想不出有什么办法能解决这个问题

解决方案 »

  1.   

    你的思路有问题吧,不知为何种目的?
    TimerCallProc中创建线程,又把句柄赋给全局变量,当然无法保证其值唯一了。可以为每个线程的句柄申请各自的空间来存储句柄。

    HANDLE *h= new HANDLE;
    *h=CreateThread....;
      

  2.   

    CreateThread和_endthread匹配吗?
    好像不匹配吧
    如果TimerCallProc定时创建的话,你的句柄有可能不一样的,这很正常
    可能会产生句柄泄露
    你要做好同步才可以啊