想知道.如何监控一个程序是否在运行.

smartson_lee 2003-10-20 12:12:53
要实现是个程序A,要它监控另一个程序B,判断B程序是否正在运行,若没有运行,就将其启动.

盼指点迷津!!!
...全文
349 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
smartson_lee 2003-10-31
  • 打赏
  • 举报
回复
谢谢各位,我找到一个方法,是采用:FindWindow函数,和createprocess函数实现.
smartson_lee 2003-10-20
  • 打赏
  • 举报
回复
用socket可能不是很方便.想问问定时查询系统进程的方式具体如何操作,谢谢啊!我这方面经验有限.
flyelf 2003-10-20
  • 打赏
  • 举报
回复
定时查询系统进程
CreateToolhelp32Snapshot、Process32First、Process32Next
vcforever 2003-10-20
  • 打赏
  • 举报
回复
1、可以用socket来实现,将你的程序A和程序B分别做成客户端和服务器端,在客户端程序中
利用TIMER来定期向服务器端发送socket消息,在服务器端来接收消息,如果消息长时间没有到达,就说明监控的目标程序已经停止运行
2、可以通过枚举系统进程,然后判断在系统进程列表中有没有目标进程,如果没有说明目标进程已经停止运行!

希望对你有所帮助!
yaoha2003 2003-10-20
  • 打赏
  • 举报
回复
同意王进
孤必有邻 2003-10-20
  • 打赏
  • 举报
回复
(结合上面的提示,给出一个代码片段)
其中,一个线程,监视进程的退出,一个按钮刷新进程列表,另一个按钮结束选中的进程
想办法对应到你的对话框应用程序,注意有个ListBox,控件名称为m_list

VOID Thread(LPVOID lParam);
BOOL CProcessDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here
AfxBeginThread((AFX_THREADPROC)Thread,0,THREAD_PRIORITY_NORMAL,0,0,NULL);

return TRUE; // return TRUE unless you set the focus to a control
}

CStringArray name;
CPtrArray AProcess;

VOID Thread(LPVOID lParam)
{
DWORD exitCode;
int count;
for(;;)
{
count=name.GetSize();
for(int i=0;i<count;i++)
{
if (GetExitCodeProcess(AProcess.GetAt(i), &exitCode))
{
if(exitCode==STILL_ACTIVE)
{
}
else
{
CString text;
text.Format("%s:ExitCode=%d",name.GetAt(i),exitCode);
AfxGetApp()->m_pMainWnd->SetWindowText(text);
name.RemoveAt(i);
break;
}
}
}
Sleep(100);
}
}

#include <tlhelp32.h>
#pragma comment(lib,"kernel32.lib")

void CProcessDlg::OnButtonList()
{
CString text;
m_list.ResetContent();

HANDLE Snapshot;
Snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 processListStr;
processListStr.dwSize=sizeof(PROCESSENTRY32);
BOOL bSuccess;
bSuccess=Process32First(Snapshot,&processListStr);

for(int i=0;bSuccess;i++)
{
name.Add(processListStr.szExeFile);
text=processListStr.szExeFile;
int c=4-strlen(processListStr.szExeFile)/8;
while(c--)text+="\t";
sprintf(processListStr.szExeFile,"%2d",i+1);
text+=processListStr.szExeFile;
m_list.AddString(text);//向列表框添加字符串
AProcess.Add(OpenProcess(PROCESS_ALL_ACCESS,FALSE,processListStr.th32ProcessID));
bSuccess=Process32Next(Snapshot,&processListStr);
}
CloseHandle(Snapshot);

GetDlgItem(IDC_BUTTON3)->EnableWindow();
}

void CProcessDlg::OnButtonKill()
{
int currentSelect;//当前选择了第几项
currentSelect=m_list.GetCurSel();//取值范围从0开始
if(currentSelect!=LB_ERR)
{
//选择了某一项
CString FileBuffer;//获得进程的可执行文件的文件名
m_list.GetText(currentSelect,FileBuffer);
FileBuffer.Insert(0,"确定 要终止的进程:\n");
if(AfxMessageBox(FileBuffer,MB_OKCANCEL,0)==IDOK)
{
//先获得该进程句柄:通过进程标识
if(AProcess.GetAt(currentSelect))
{
TerminateProcess(AProcess.GetAt(currentSelect),0);
AfxMessageBox("指定进程已被终止!");
OnButtonList();//刷新显示
}
}
}
}

15,472

社区成员

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

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