关于进程监视

ilovevc709 2005-09-12 11:13:19
我想实时监视一个程序是否运行,如果没运行就启动它.
我的方法是使用CreateToolhelp32Snapshot,Process32First,Process32Next遍历进程,基本上也可以实现这个功能,但是出现了一个问题,由于循环使用CreateToolhelp32Snapshot导致了页面错误数不断增加,因而虚拟内存占用很大,请问各位大大有没有其他能够控制进程的函数,可否告知.
在此先谢谢了.
...全文
308 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoguaiwei 2005-09-26
  • 打赏
  • 举报
回复
mark
ilovevc709 2005-09-13
  • 打赏
  • 举报
回复
谢谢大家.
给分了.
toxyboy 2005-09-13
  • 打赏
  • 举报
回复
this is not a good idea..try send msg to ur monitor so that estimate ur be monitored process!!!
weiym 2005-09-12
  • 打赏
  • 举报
回复
怎么会页面错误不断增加,你程序有问题吧
你可以让这个程序一启动就在注册表里写个东西,退出写另外一个,然后只要检测注册表的标志就知道有没有运行了.
但如果是异常退出就来不及写标志了
ilovevc709 2005-09-12
  • 打赏
  • 举报
回复
谢谢两位大侠的回复,但是我想知道的主要是CreateToolhelp32Snapshot会找成页面错误不断增加的问题(在任务管理器中可以看到).同时页面错误增加会造成什么后果?会不会造成虚拟内存增加而导致系统崩溃?如果会,有没有什么解决的办法,如可以代替CreateToolhelp32Snapshot功能的函数.
吹泡泡的小猫 2005-09-12
  • 打赏
  • 举报
回复
CreateToolhelp32Snapshot创建的美举句柄,要调用CloseHandle销毁
legendhui 2005-09-12
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1220
http://www.vckbase.com/document/viewdoc/?id=1530
phoenix96_2000 2005-09-12
  • 打赏
  • 举报
回复
页面错误简单说就是数据没有在物理内存中,需要从磁盘上读取到物理内存,
与虚拟内存占用增多没什么直接关系,

就是多了以为着访问磁盘次数增多,自然会造成系统变慢

phoenix96_2000 2005-09-12
  • 打赏
  • 举报
回复
试试Process Status Helper API有没有问题:
copy from MSDN:

Enumerating All Processes
Task Manager is an example of a program that enumerates all running processes. It is implemented using data from the performance registry. The following sample code uses the EnumProcesses function to enumerate the current processes in the system. This method is easier than using the performance registry.


#include <windows.h>
#include <stdio.h>
#include "psapi.h"

void PrintProcessNameAndID( DWORD processID )
{
char szProcessName[MAX_PATH] = "unknown";

// Get a handle to the process.

HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, processID );

// Get the process name.

if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;

if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName) );
}
else return;
}
else return;

// Print the process name and identifier.

printf( "%s (Process ID: %u)\n", szProcessName, processID );

CloseHandle( hProcess );
}

void main( )
{
// Get the list of process identifiers.

DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;

if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
return;

// Calculate how many process identifiers were returned.

cProcesses = cbNeeded / sizeof(DWORD);

// Print the name and process identifier for each process.

for ( i = 0; i < cProcesses; i++ )
PrintProcessNameAndID( aProcesses[i] );
}
ilovevc709 2005-09-12
  • 打赏
  • 举报
回复
UP
ilovevc709 2005-09-12
  • 打赏
  • 举报
回复
我查看了一下任务管理器,explorer.exe和KVsrvXp_1.exe("江民"?)也存在页面错误不断增加的问题啊.我的代码如下,很简单的一段代码,一个简单的对话框程序.(SetTimer(1,100,NULL))
void CMyDlg::OnTimer(UINT nIDEvent)
{
DWORD processid;
① HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//创建系统快照
PROCESSENTRY32 lPrs;
ZeroMemory(&lPrs,sizeof(lPrs));
lPrs.dwSize=sizeof(lPrs);
Process32First(hSnap,&lPrs);//取得系统快照里第一个进程信息
if (strstr("aaa.exe",lPrs.szExeFile))//判断进程信息是否是targetFile
{
processid=lPrs.th32ProcessID;
}
while(Process32Next(hSnap,&lPrs))
{
if (stricmp("aaa.exe",lPrs.szExeFile)==0)
{
processid=lPrs.th32ProcessID;
break;
}
}
② CloseHandle(hSnap);②①

CDialog::OnTimer(nIDEvent);

屏蔽两个①中间的代码就不会有页面错误不断增加的问题了,屏蔽②之间的代码(就是CloseHandle),则会导致句柄增加,内存占用增加.那么是否代表页面错误增加不会有不良的影响??
谢谢各位大侠的回复.小弟我实在是感激涕凌.你们就是沙漠里的甘泉,黑暗中的明灯啊.
oyljerry 2005-09-12
  • 打赏
  • 举报
回复
正确的退出进程,关闭句柄等

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧