社区
进程/线程/DLL
帖子详情
如何执行一个进程,并挂起自己直到那个进程结束,才执行下一步操作
luoxiangdong
2004-06-25 02:54:35
如题
...全文
572
15
打赏
收藏
如何执行一个进程,并挂起自己直到那个进程结束,才执行下一步操作
如题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
luoxiangdong
2004-07-19
打赏
举报
回复
谢谢各位了
lmfweng
2004-07-02
打赏
举报
回复
up
fzd999
2004-07-02
打赏
举报
回复
呵呵,好热闹~
Kudeet
2004-06-28
打赏
举报
回复
创建进程的函数为CreateProcess,该函数比较复杂共有十个参数。
BOOL CreateProcess(
LPCTSTR lpApplicationName, // 执行程序文件名
LPTSTR lpCommandLine, // 参数行
LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程安全参数
LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程安全参数
BOOL bInheritHandles, // 继承标记
DWORD dwCreationFlags, // 创建标记
LPVOID lpEnvironment, // 环境变量
LPCTSTR lpCurrentDirectory, // 运行该子进程的初始目录
LPSTARTUPINFO lpStartupInfo, // 创建该子进程的相关参数
LPPROCESS_INFORMATION lpProcessInformation // 创建后用于被创建子进程的信息
);
lpApplicationName:为执行程序的文件名,如果在创建进程时要使用参数,则该参数可以为NULL。
lpCommandLine:为参数行,如果无参数可以为NULL,在有参数传递给进程时如下设置:lpApplicationName=NULL;lpCommandLine=para,例如lpCommandLine="c:\\windows\\notepad.exe c:\\autoexec.bat"。
lpProcessAttributes,lpThreadAttributes:分别描述了创建的进程和线程安全属性,如果使用NULL表示使用默认的安全描述。
bInheritHandles:表示当前进程中的打开的句柄是否能够被创建的子进程所继承。
dwCreationFlags:表示创建标记,通过该标记可以设置进程的创建状态和优先级别。常用的有下面的标记:
CREATE_NEW_CONSOLE:为子进程创建一个新的控制台。
CREATE_SUSPENDED:子进程在创建时为挂起状态。
HIGH_PRIORITY_CLASS/NORMAL_PRIORITY_CLASS:高/普通优先级别。
lpEnvironment:表示子进程所使用的环境变量,如果为NULL,则表示与当前进程使用相同的环境变量。
lpCurrentDirectory:表示子进程运行的初始目录。
lpStartupInfo:用于在创建子进程时设置各种属性。该结构定义如下:
typedef struct _STARTUPINFO { // si
DWORD cb; //结构长度
LPTSTR lpReserved; //保留
LPTSTR lpDesktop; //保留
LPTSTR lpTitle; //如果为控制台进程则为显示的标题
DWORD dwX; //窗口位置
DWORD dwY; //窗口位置
DWORD dwXSize; //窗口大小
DWORD dwYSize; //窗口大小
DWORD dwXCountChars; //控制台窗口字符号宽度
DWORD dwYCountChars; //控制台窗口字符号高度
DWORD dwFillAttribute; //控制台窗口填充模式
DWORD dwFlags; //创建标记
WORD wShowWindow; //窗口显示标记如同ShowWindow中的标记
WORD cbReserved2; //
LPBYTE lpReserved2; //
HANDLE hStdInput; //标准输入句柄
HANDLE hStdOutput; //标准输出句柄
HANDLE hStdError; //标准错误句柄
} STARTUPINFO, *LPSTARTUPINFO;
如果要使结构中相关的分量起作用,必须正确的设置dwFlags。例如:dwFlags包含STARTF_USESIZE表示dwXSize和dwYSize有效,包含STARTF_USEPOSITION表示dwX和dwY有效。
lpProcessInformation:用来在进程创建后接收相关信息,该结构由系统填写。
typedef struct _PROCESS_INFORMATION { // pi
HANDLE hProcess; //进程句柄
HANDLE hThread; //进程的主线程句柄
DWORD dwProcessId; //进程ID
DWORD dwThreadId; //进程的主线程ID
} PROCESS_INFORMATION;
fenghuozhijin
2004-06-28
打赏
举报
回复
我createprocess()返回0,怎么办呀?能不能举个具体的例子。
fenghuozhijin
2004-06-28
打赏
举报
回复
EVC下实现了,可是有几个参数看不明白。不好意思,菜鸟一个。
lianglp
2004-06-28
打赏
举报
回复
呵呵,楼上说得很清楚了。
fenghuozhijin
2004-06-27
打赏
举报
回复
不错不错.
功名半纸
2004-06-26
打赏
举报
回复
都说完了!!!没得说了!^_^
HANDLE hprocess = CreateProcess(……);
WaitForSingleObject(hprocess, INFINITE);
进程不退出则wait不返回
Wenxy1
2004-06-26
打赏
举报
回复
呵呵,顺便看看。
zhang_zhibin
2004-06-26
打赏
举报
回复
办法不少,都可以
btbq
2004-06-26
打赏
举报
回复
使用事件对象,用于线程间通信:
如:
CEvent threadStart;//定义全局变量
……
::WaitForSingleObject(threadStart.m_hObject,INFINITE);//无限时间阻塞当前线程
……
threadStart.SetEvent();//在另一个线程结束时调用,即可取消上一线程的阻塞
vcforever
2004-06-26
打赏
举报
回复
使用CreateProcess来启动进程
BOOL CreateProcess(
LPCTSTR lpApplicationName, // name of executable module
LPTSTR lpCommandLine, // command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD
LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
BOOL bInheritHandles, // handle inheritance option
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // new environment block
LPCTSTR lpCurrentDirectory, // current directory name
LPSTARTUPINFO lpStartupInfo, // startup information
LPPROCESS_INFORMATION lpProcessInformation // process information
);
该函数的最后一个参数是一个指向PROCESS_INFORMATION结构的指针,当使用CreateProcess启动进程之后,该结构就会被填充(记录下了所启动进程的信息)
typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION;
然后你可以在你的主进程中使用WaitForSingleObject函数来等待子进程,当子进程结束后,WaitForSingleObject函数才返回,这样就可以达到楼主的要求了!
例如:
PROCESS_INFORMATION processInfo;
ZeroMemory(&processInfo, sizeof(PROCESS_INFORMATION));
CreatePorcess("test.exe",...,&processInfo);
WaitForSingleObject(processInfo.hProcess, INFINITE);
这样就可以达到要求了!
希望对你又所帮助!
halk
2004-06-25
打赏
举报
回复
哦,错了错了,hprocess不是函数返回的,而是在最后一个参数的PROCESS_INFORMATION结构中返回。
halk
2004-06-25
打赏
举报
回复
等待进程对象。
HANDLE hprocess = CreateProcess(……);
WaitForSingleObject(hprocess, INFINITE);
进程不退出则wait不返回
进程
的
挂起
状态解析
本文深入探讨了
进程
状态,包括
挂起
状态的定义、与阻塞状态的区别,以及如何主动
挂起
程序。通过对比sleep和wait函数,阐述了
挂起
状态在
操作
系统中的重要作用。
【
操作
系统】
进程
及
进程
的基本状态及转换图
本文深入解析
进程
的概念,探讨
进程
的定义、特征与程序的区别,并详细阐述
进程
的基本状态及其转换过程,包括
挂起
与激活
操作
对
进程
状态的影响。
linux
进程
的前台
执行
,后台
执行
和
挂起
本文介绍在Linux终端中如何使用ctrl+c、ctrl+z等快捷键控制
进程
,包括
结束
、
挂起
和恢复
进程
的方法,并演示了如何利用jobs、bg、fg和kill命令管理后台任务。
进程
的创建终止、阻塞唤醒、
挂起
激活(
操作
系统)
本文围绕
操作
系统中
进程
的控制展开,介绍了引起创建
进程
的事件及创建步骤,如申请空白PCB、分配资源等;阐述了
进程
终止的原因和终止过程;还说明了
进程
阻塞、唤醒、
挂起
和激活的事件及相应过程,同时提及了Win32中的相关API函数。
阻塞与
挂起
的区别
本文深入探讨了线程与
进程
在
操作
系统中的阻塞、
挂起
及睡眠状态,阐述了各种状态之间的区别与联系,包括状态转换的原因和时机,以及非阻塞方法的引入。
进程/线程/DLL
15,465
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章