社区
进程/线程/DLL
帖子详情
如何执行一个进程,并挂起自己直到那个进程结束,才执行下一步操作
luoxiangdong
2004-06-25 02:54:35
如题
...全文
534
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不返回
Linux
操作
系统
进程
的状态和转换(五态模型)
挂起
等待态→
挂起
就绪态:引起
进程
等待的事件发生之后,相应的
挂起
等待态
进程
将转换为
挂起
就绪态
挂起
就绪态→就绪态:当内存中没有就绪态
进程
,或者
挂起
就绪态
进程
具有比就绪态
进程
更高的优先级,系统将把
挂起
就绪态
进程
转换成就绪态。运行态→
挂起
就绪态:当
一个
具有较高优先级的
挂起
等待态
进程
的等待事件
结束
后,它需要抢占 CPU,而此时主存空间不够,从而可能导致正在运行的
进程
转化为
挂起
就绪态。运行态→终止态:当
一个
进程
到达了自然
结束
点,或是出现了无法克服的错误,或是被
操作
系统所终结,或是被其他有终止权的
进程
所终结。
系统
操作
原理:
进程
的状态和转换(五态模型)
起到平滑系统
操作
负荷的目的。
挂起
等待态→
挂起
就绪态:引起
进程
等待的事件发生之后,相应的
挂起
等待态
进程
将转换为
挂起
就绪态
挂起
就绪态→就绪态:当内存中没有就绪态
进程
,或者
挂起
就绪态
进程
具有比就绪态
进程
更高的优先级,系统将把
挂起
就绪态
进程
转换成就绪态。运行态→
挂起
就绪态:当
一个
具有较高优先级的
挂起
等待态
进程
的等待事件
结束
后,它需要抢占 CPU,而此时主存空间不够,从而可能导致正在运行的
进程
转化为
挂起
就绪态。就绪态→
挂起
就绪态:
操作
系统根据当前资源状况和性能要求,也可以决定把就绪态
进程
对换出去成为
挂起
就绪态。
线程和
进程
/阻塞和
挂起
以及那些sleep,wait()和notify()方法详解
线程与
进程
的阻塞 线程阻塞 线程在运行的过程中因为某些原因而发生阻塞,阻塞状态的线程的特点是:该线程放弃CPU的使用,暂停运行,只有等到导致阻塞的原因消除之后才回复运行,或者是被其他的线程中断,该线程也会退出阻塞状态,同时抛出InterruptedException。
进程
阻塞 正在
执行
的
进程
由于发生某时间(如I/O请求、申请缓冲区失败等)暂时无法继续
执行
。此时引起
进程
调度,OS把处理机分配给另
一个
就绪
进程
,而让受阻
进程
处于暂停状态,一般将这种状态称为阻塞状态。
进程
的
挂起
挂起
进程
在
操作
系统中可以定义为暂
操作
系统|
进程
状态
一、
进程
的状态和装换 1.1
进程
的三态模型 按
进程
在
执行
过程中的不同情况至少要定义三种状态: 运行(running)态:
进程
占有处理器正在运行的状态。
进程
已获得CPU,其程序正在
执行
。在单处理机系统中,只有
一个
进程
处于
执行
状态; 在多处理机系统中,则有多个
进程
处于
执行
状态。 就绪(ready)态:
进程
具备运行条件,等待系统分配处理器以便运行的状态。 当
进程
已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即
执行
,
进程
这时的状态称为就绪状态。在
一个
系统中处于就绪状态的
进程
可能有多个,通常将它们
Linux
操作
系统——
进程
管理
1.程序的顺序
执行
与并发
执行
程序的顺序
执行
: 程序的各
操作
步骤之间依序
执行
,程序与程序之间串行
执行
,称为顺序
执行
。顺序
执行
时单道程序系统中的程序的运行方式。 特点: (1)顺序性:
一个
操作
结束
,下
一个
操作
才能开始
执行
。多个程序要运行时,仅当
一个
程序全部
执行
结束
,另
一个
程序才能开始。 (2)封闭性:程序在封闭环境中运行,即程序运行时独占所有资源,程序的
执行
过程不受外界影响,结果只取决于程序自身。 (3)可再现性:程序
执行
的结果与运行的时间和速度无关,结果都是可再现的,重复
执行
该程序结果相同。
进程/线程/DLL
15,471
社区成员
49,181
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章