利用creatprocess创建新进程,并使用WaitForSingleObject等待出现的问题

sniper_chenxl 2011-10-11 10:47:51
本人最近想利用VC调用Fluent并让它后台运行,于是使用creatprocess函数创建新进程,再利用WaitForSingleObject函数等待Fluent运行结束后再执行下一步程序。
在写程序过程中发现,当为Fluent选择运算类型时,比如二维或三维(Fluent进行计算之前,先要选择运算器,分二维和三维的),还未使用Fluent进行计算,WaitForSingleObject函数判断Fluent运行结束了。我调用其他软件(不需要选择版本)时,程序可以正常运行。不知道是否有哪位前辈遇到过类似情况,就是调用带有选择版本的软件?
#include <stdio.h>
#include <windows.h>
#include <string.h>
//#include <afx.h>
//#include <afxwin.h>


void main(void)
{
//命令行参数
char cmdline[]="2d -i C:\\Fluent\\Mixer_Test1.journal";
//这里解释下上面的语句,2d就是选择Fluent运算类型,这里是2维,后面是Fluent批处理文件所在目录;这里要提的是,即使我不定义creatprocess中的第二个参数,令其为NULL,单纯调用fluent,在选择运算类型时,程序也不会进行等待。
char m_FluentDir[]="C:\\Fluent.Inc\\ntbin\\ntx86\\fluent.exe";
//这里调用CMD,运行就是正确的
//char m_FluentDir[]="C:\\windows\\system32\\cmd.exe";
//调用VS也是
//char m_FluentDir[]="D:\\02_Entertaiment Pro\\VS正式版3.0\\VSClient.exe";
char m_WorkDir[]="C:\\Fluent";

DWORD idFlagW;
BOOL bRet;
//创建新进程
//定义STARTUPINFO结构指针
STARTUPINFO StartupInfo={sizeof(StartupInfo)};
//StartupInfo={sizeof(StartupInfo)};
PROCESS_INFORMATION ProcessInfo;
//memset(&StartupInfo,0,sizeof(STARTUPINFO));
//StartupInfo.cb=sizeof(STARTUPINFO);

StartupInfo.dwFlags=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow=SW_HIDE;

//创建新进程
bRet=CreateProcess(m_FluentDir,NULL,NULL,NULL,FALSE,0,NULL,m_WorkDir,&StartupInfo,&ProcessInfo);
if(!bRet)
{
printf("调用程序失败!\r\n 计算已经完成");
return;
}


idFlagW=WaitForSingleObject(ProcessInfo.hProcess ,INFINITE);
if (idFlagW == WAIT_OBJECT_0)
{
printf("Process is signaled...\n");
}
else if (idFlagW == WAIT_TIMEOUT)
{
printf("Time out...\n");
}
else if (idFlagW == WAIT_FAILED)
{
printf("Invalid process handle...\n");
}

printf("调用程序成功!\r\n 计算已经完成");
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);


}


运行结果:Fluent还未运行完毕(关闭),在cmd中就已经显示Process is signaled。调用程序成功!计算已经完成
...全文
417 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sniper_chenxl 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 oyljerry 的回复:]

引用 5 楼 sniper_chenxl 的回复:
引用 4 楼 oyljerry 的回复:

fluent.exe 这个exe的行为可能会当前这个exe退出了.所以还没开始,你就触发了.
大锅,能具体点儿不

就是你调用fluent.exe的时候,它马上就结束了,而它可能启动另一个进程来做的计算等,你可以任务管理器观察一下
[/Quote]
晕死,还真是你说的,调用Fluent的时候,进程是fluent.exe,选择版本后就变成fl6326s.exe。这有解决方法没,我尝试直接调用fl6326s.exe,失败。
CppCoder 2011-10-11
  • 打赏
  • 举报
回复
1 调查Fluent.exe的运行参数设置是否正确
2 用 "-" 表示参数
3 整个命令中如有空格,把整个命令用引号括起来,
如:char *pszCmd = "\"Fluent.exe -ParamA -ParamB\"";
oyljerry 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sniper_chenxl 的回复:]
引用 4 楼 oyljerry 的回复:

fluent.exe 这个exe的行为可能会当前这个exe退出了.所以还没开始,你就触发了.
大锅,能具体点儿不
[/Quote]
就是你调用fluent.exe的时候,它马上就结束了,而它可能启动另一个进程来做的计算等,你可以任务管理器观察一下
sniper_chenxl 2011-10-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oyljerry 的回复:]

fluent.exe 这个exe的行为可能会当前这个exe退出了.所以还没开始,你就触发了.
[/Quote]大锅,能具体点儿不
oyljerry 2011-10-11
  • 打赏
  • 举报
回复
fluent.exe 这个exe的行为可能会当前这个exe退出了.所以还没开始,你就触发了.
sniper_chenxl 2011-10-11
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <windows.h>
#include <string.h>
//#include <afx.h>
//#include <afxwin.h>


void main(void)
{
//命令行参数
char cmdline[]= "2d -i C:\\Fluent\\Mixer_Test1.journal ";
//这里解释下上面的语句,2d就是选择Fluent运算类型,这里是2维,后面是Fluent批处理文件所在目录;这里要提的是,即使我不定义creatprocess中的第二个参数,令其为NULL,单纯调用fluent,在选择运算类型时,程序也不会进行等待。
char m_FluentDir[]= "C:\\Fluent.Inc\\ntbin\\ntx86\\fluent.exe ";
//这里调用CMD,运行就是正确的
//char m_FluentDir[]= "C:\\windows\\system32\\cmd.exe ";
//调用VS也是
//char m_FluentDir[]= "D:\\02_Entertaiment Pro\\VS正式版3.0\\VSClient.exe ";
char m_WorkDir[]= "C:\\Fluent ";

DWORD idFlagW;
BOOL bRet;
//创建新进程
//定义STARTUPINFO结构指针
STARTUPINFO StartupInfo={sizeof(StartupInfo)};
//StartupInfo={sizeof(StartupInfo)};
PROCESS_INFORMATION ProcessInfo;
//memset(&StartupInfo,0,sizeof(STARTUPINFO));
//StartupInfo.cb=sizeof(STARTUPINFO);

StartupInfo.dwFlags=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow=SW_HIDE;

//创建新进程
bRet=CreateProcess(m_FluentDir,NULL,NULL,NULL,FALSE,0,NULL,m_WorkDir,&StartupInfo,&ProcessInfo);
if(!bRet)
{
printf( "调用程序失败!\r\n 计算已经完成 ");
return;
}


idFlagW=WaitForSingleObject(ProcessInfo.hProcess ,INFINITE);
if (idFlagW == WAIT_OBJECT_0)
{
printf( "Process is signaled...\n ");
}
else if (idFlagW == WAIT_TIMEOUT)
{
printf( "Time out...\n ");
}
else if (idFlagW == WAIT_FAILED)
{
printf( "Invalid process handle...\n ");
}

printf( "调用程序成功!\r\n 计算已经完成 ");
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);


}
sniper_chenxl 2011-10-11
  • 打赏
  • 举报
回复
额,汗,加入的程序咋没起作用。大家忽略2、3楼,谢谢!
sniper_chenxl 2011-10-11
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <windows.h>
#include <string.h>
//#include <afx.h>
//#include <afxwin.h>


void main(void)
{
//命令行参数
char cmdline[]= "2d -i C:\\Fluent\\Mixer_Test1.journal ";
//这里解释下上面的语句,2d就是选择Fluent运算类型,这里是2维,后面是Fluent批处理文件所在目录;这里要提的是,即使我不定义creatprocess中的第二个参数,令其为NULL,单纯调用fluent,在选择运算类型时,程序也不会进行等待。
char m_FluentDir[]= "C:\\Fluent.Inc\\ntbin\\ntx86\\fluent.exe ";
//这里调用CMD,运行就是正确的
//char m_FluentDir[]= "C:\\windows\\system32\\cmd.exe ";
//调用VS也是
//char m_FluentDir[]= "D:\\02_Entertaiment Pro\\VS正式版3.0\\VSClient.exe ";
char m_WorkDir[]= "C:\\Fluent ";

DWORD idFlagW;
BOOL bRet;
//创建新进程
//定义STARTUPINFO结构指针
STARTUPINFO StartupInfo={sizeof(StartupInfo)};
//StartupInfo={sizeof(StartupInfo)};
PROCESS_INFORMATION ProcessInfo;
//memset(&StartupInfo,0,sizeof(STARTUPINFO));
//StartupInfo.cb=sizeof(STARTUPINFO);

StartupInfo.dwFlags=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow=SW_HIDE;

//创建新进程
bRet=CreateProcess(m_FluentDir,NULL,NULL,NULL,FALSE,0,NULL,m_WorkDir,&StartupInfo,&ProcessInfo);
if(!bRet)
{
printf( "调用程序失败!\r\n 计算已经完成 ");
return;
}


idFlagW=WaitForSingleObject(ProcessInfo.hProcess ,INFINITE);
if (idFlagW == WAIT_OBJECT_0)
{
printf( "Process is signaled...\n ");
}
else if (idFlagW == WAIT_TIMEOUT)
{
printf( "Time out...\n ");
}
else if (idFlagW == WAIT_FAILED)
{
printf( "Invalid process handle...\n ");
}

printf( "调用程序成功!\r\n 计算已经完成 ");
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);


}

15,467

社区成员

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

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