读书人

这段代码运行后为什么假死?解决办法

发布时间: 2012-02-15 12:09:44 作者: rapoo

这段代码运行后为什么假死?

C/C++ code
void tp(long pid){HANDLE phandle=OpenProcess(PROCESS_ALL_ACCESS,False,pid);TerminateProcess(phandle,0);}void __fastcall TForm1::Button1Click(TObject *Sender){char pname[2048];long pid;strcpy(pname,Edit1->Text.c_str());PROCESSENTRY32 pe32;//在使用这个结构前,先设置它的大小   pe32.dwSize = sizeof(pe32);//给系统内所有的进程拍个快照   HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);if (hProcessSnap == INVALID_HANDLE_VALUE){MessageBox(NULL,"函数调用错误!","错误",MB_OK);}BOOL bMore = Process32First(hProcessSnap,&pe32);while (bMore){if (pe32.szExeFile == pname){pid=pe32.th32ProcessID;} else {Process32Next(hProcessSnap,&pe32);}}tp(pid);CloseHandle(hProcessSnap);}

运行这段代码后某CPU核心占用率100%……

[解决办法]
造成死循环的根本原因在于bMore的值永远为true,加不加ProcessMessages没什么意义.
修改为以下即可:
C/C++ code
while (bMore){    if (pe32.szExeFile == pname)    {        pid=pe32.th32ProcessID;        break;    }    else    {        bMore = Process32Next(hProcessSnap,&pe32);    }}
[解决办法]
C/C++ code
//得到快照第一个进程信息    Process32First(hProcessSnap,&pe32);    do    {        if(lstrcmpi(pe32.szExeFile,pname)==0) //比较两个字符串,此比较不区分大小写;        {            pid=pe32.th32ProcessID;            break;        }    }while(Process32Next(hProcessSnap,&pe32));//获取下一个 

读书人网 >C++ Builder

热点推荐