建一对话框,在其initdialog里,创建一线程,线程里有这一句:
while(TRUE)
{
..
     WaitForSingleObject(handle1,1000);
....}
一运行,CPU占接近100%,不知如何解决?

解决方案 »

  1.   

    handle1 要设置为无信号啊。
      

  2.   

    一定是死循环了. handle1开始应是无信号状态, 当有任务需要线程处理的时候,将设置这个信号. 线程被唤醒. 执行指定的任务, 当任务完成之后,通常线程会向什么地方发出信号,然后一般会自己主动将这个信号置成无. 然后循环回来,继续在这里沉睡等待.如果这样处理了,CPU还是很高,那只能说明是你的线程任务太重了,可以考使用多个线程来并发处理,或者,干脆,用线程池来做了
      

  3.   

    是这样的
    initdialog里
    ...
         OVERLAPPED      overLapped;
         DWORD   dwError;
         //HANDLE  handle;
         HANDLE  handle,h2;
         handle=CreateEvent(NULL, // SD
                            FALSE,   // reset type
                            FALSE, // initial state
                            "IPChang.data"    // object name
                            );
         overLapped.hEvent=handle;
         NotifyAddrChange(&h2,&overLapped);     //创建一个子进程来等待消息
         LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL;
         SIZE_T dwStackSize = 0;
         //LPTHREAD_START_ROUTINE lpStartAddress;
         LPVOID lpParameter = (LPVOID)&handle;
         DWORD dwCreationFlags = 0 ;
         DWORD lpThreadId;
         HANDLE  THandle = CreateThread(lpThreadAttributes,dwStackSize,WaitForEvent,lpParameter,dwCreationFlags,&lpThreadId);
    ...DWORD  WINAPI  WaitForEvent(LPVOID data)
    {
         HANDLE handle;
         DWORD  dwError;
         handle=*(HANDLE*)data;     while(TRUE)
        {
               dwError=WaitForSingleObject(handle,WAIT_OBJECT_0);           // 系统改变了IP地址
       ::MessageBox(NULL,"CHANGE IP","OK",MB_OK);
        }
    }
      

  4.   

    注意你的HANDLE :[这个变量是局部的,位于函数的调用堆栈,,这样的参数传给线程是不安全的,可能你的线程还没执行到: handle=*(HANDLE*)data; 启动线程的那个函数已经返回,原来的局部变量都会被破坏的. 你可以将它作为一个指针传入线程,而不是通过引用堆栈内部的原变量 : LPVOID lpParameter = (LPVOID)handle;线程里直接取用:
    DWORD  WINAPI  WaitForEvent(LPVOID data)
    {
         HANDLE handle;
         DWORD  dwError;
         handle=(HANDLE)data;
         ....
    HANDLE 通常也是一个指针,应该跟指针一样大的, 这样传递是安全的
      

  5.   

    dwError=WaitForSingleObject(handle,WAIT_OBJECT_0);WAIT_OBJECT_0的值就是0直接返回相当于执行while(TRUE)
    {}
    死循环
      

  6.   

    dwError=WaitForSingleObject(handle,WAIT_OBJECT_0);
    中第二个参数是等待时间啊,怎么用WAIT_OBJECT_0?
      

  7.   

    while(TRUE)
    需要有一个退出条件,要不就一直在循环中了
      

  8.   

    while(true)后面加Sleep(1)看看吧。