问一个问题,是关于线程同步的,老出现CPU占用率9x 建一对话框,在其initdialog里,创建一线程,线程里有这一句:while(TRUE){.. WaitForSingleObject(handle1,1000);....}一运行,CPU占接近100%,不知如何解决? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 handle1 要设置为无信号啊。 一定是死循环了. handle1开始应是无信号状态, 当有任务需要线程处理的时候,将设置这个信号. 线程被唤醒. 执行指定的任务, 当任务完成之后,通常线程会向什么地方发出信号,然后一般会自己主动将这个信号置成无. 然后循环回来,继续在这里沉睡等待.如果这样处理了,CPU还是很高,那只能说明是你的线程任务太重了,可以考使用多个线程来并发处理,或者,干脆,用线程池来做了 是这样的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); }} 注意你的HANDLE :[这个变量是局部的,位于函数的调用堆栈,,这样的参数传给线程是不安全的,可能你的线程还没执行到: handle=*(HANDLE*)data; 启动线程的那个函数已经返回,原来的局部变量都会被破坏的. 你可以将它作为一个指针传入线程,而不是通过引用堆栈内部的原变量 : LPVOID lpParameter = (LPVOID)handle;线程里直接取用:DWORD WINAPI WaitForEvent(LPVOID data){ HANDLE handle; DWORD dwError; handle=(HANDLE)data; ....HANDLE 通常也是一个指针,应该跟指针一样大的, 这样传递是安全的 dwError=WaitForSingleObject(handle,WAIT_OBJECT_0);WAIT_OBJECT_0的值就是0直接返回相当于执行while(TRUE){}死循环 dwError=WaitForSingleObject(handle,WAIT_OBJECT_0);中第二个参数是等待时间啊,怎么用WAIT_OBJECT_0? while(TRUE)需要有一个退出条件,要不就一直在循环中了 while(true)后面加Sleep(1)看看吧。 问个对话框内movewindow的问题 链接问题,欢迎大家讨论! 还有的DISPID叫啥名字呢? 郁闷,CBitmapButton加背景图出错,搞了半天,大侠进来 vc++ classwizzard problem 如何在dos下用c语言调用lib文件 请问怎么设置ListCtrl的行宽? webbrowser2!!!!!!!!极其简单的100分!!!!!!!!!!! 我想在程序中,设置程序本身在计算机启动时启动,怎么做? 请教:如何对24位BMP图象逐个颜色进行处理? CxxxDoc、CxxxView是怎么变成对象的??? 有直接的函数可以显示内存中的图像吗?
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);
}
}
DWORD WINAPI WaitForEvent(LPVOID data)
{
HANDLE handle;
DWORD dwError;
handle=(HANDLE)data;
....
HANDLE 通常也是一个指针,应该跟指针一样大的, 这样传递是安全的
{}
死循环
中第二个参数是等待时间啊,怎么用WAIT_OBJECT_0?
需要有一个退出条件,要不就一直在循环中了