HANDLE threads= (HANDLE)_beginthread( Bounce, 。。);
 HANDLE threads1 = (HANDLE)_beginthread( CheckKey, 。。 );
void CheckKey( void *dummy )
{
while(1)
{
 WaitForSingleObject(threads,INFINITE);
Sleep(300);
ResetEvent(threads);
printf("CheckKey the temp is \n");
}

}
void Bounce( void *ch )
{
Sleep(1000);
printf("Bounce\n");}
我把这个简易的代码大概说一下,就是通过WaitForSingleObject 来保证让Bounce这个函数先执行,它执行完了之后CheckKey再执行,但是,现在出现个问题,就是threads 这个句柄怎么始终是有信号装状态啊,我用ResetEvent(threads)之后,当下一次循环进来的时候WaitForSingleObject依然能往下执行。
 请问我怎么做才能让这个threads句柄编程无信号状态呢?

解决方案 »

  1.   

    为什么这样设计?
    换一种展开线程的方法,展开后resume
    或者在Bounce后再展开CheckKey线程
    或者在CheckKey线程里等待事件
      

  2.   

    用信号量试试:
    HANDLE handleSemaphore = CreateSemaphore(NULL,0,1,NULL);DWORD result=WaitForSingleObject(handleSemaphore,INFINITE);
    ReleaseSemaphore(handleSemaphore,1,NULL);
      

  3.   

    就是threads 这个句柄怎么始终是有信号装状态啊,我用ResetEvent(threads)之后,当下一次循环进来的时候WaitForSingleObject依然能往下执行。
     请问我怎么做才能让这个threads句柄编程无信号状态呢?
    =========
    对于线程内核对象来说,并不用ResetEvent来设置它的信号。
    当线程未结束时,它没有信号,当线程结束之后,它就有信号。
      

  4.   

    lz你什么句柄都拿来ResetEvent呢。汗死~
      

  5.   

    囧,ResetEvent(threads);自己Debug调试看函数执行成功了没有?
    BOOL WINAPI ResetEvent( 
      __in  HANDLE hEvent
    );Parameters
    hEvent 
    A handle to the event object. The CreateEvent or OpenEvent function returns this handle. 很显然,GetLastError函数返回无效的句柄
      

  6.   

    你线程返回了 肯定会是single状态了。
    另外ResetEvent用法不对啊。它是针对事件句柄的啊。你的问题就是线程同步,用事件吧。
      

  7.   

    1.你用了WaitForSingleObject(threads,INFINITE),干嘛外面还要用while包起来呢?在threads无信号时,WaitForSingleObject会将你的主线程挂起来,直到threads指向的线程执行完成(转为有信号),主线程才会继续下去
    2.threads的信号不是你人为设置的,它是随线程状态变化的,线程执行时为无信号,线程返回后为有信号
      

  8.   

    楼主,threads是线程的句柄,而RESETEVENT是用来设置信号量的句柄,你这边都没有信号量,当然不会成功了
      

  9.   

    不要见到句柄就要用SetEvent,顾名思义,这是用于设置Event事件的。对于线程来说,线程没返回前你是等不到的!
      

  10.   

    ResetEvent(threads);
    给你个例子:
    m_hThread = CreateThread(NULL, 0, ThreadProc, 0, CREATE_SUSPENDED, NULL); SetThreadPriority(m_hThread, THREAD_PRIORITY_TIME_CRITICAL);
    ResumeThread(m_hThread);
      

  11.   

    ResetEvent(threads);是不对的
    给你个例子:
    m_hThread = CreateThread(NULL, 0, ThreadProc, 0, CREATE_SUSPENDED, NULL);SetThreadPriority(m_hThread, THREAD_PRIORITY_TIME_CRITICAL);
    ResumeThread(m_hThread);