首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

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

2012-02-15 
这段代码运行后为什么假死?C/C++ codevoid tp(long pid){HANDLE phandleOpenProcess(PROCESS_ALL_ACCESS,

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

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));//获取下一个 

热点排行