我只需要使用MSMPI编写一个简单的MFC Windows应用程序,但我不想启动多个进程,因为我的GUI应用程序可能需要在多线程部分之前进行一些用户交互。例如,我想在点击“运行”按钮后创建2个线程。
我尝试使用命令行运行我的程序:mpiexec.exe -n 2 myprogram.exe但这将创建两个进程,我将看到两个应用程序窗口。
我也在Visual Studio 2010中尝试了MPI群集调试选项,但它也创建了两个进程。
这似乎是一个非常基本的问题,但我发现很难在Google找到答案。
修改
为了消除这里的困惑,我必须澄清一些事情:
简单地说,我想为支持MPI的软件创建一个MFC GUI包装器,这必须是一个多线程程序,而不是这个GUI包装程序的多个实例(进程)(例如,通过mpiexec -n 2 xxx运行该程序) .exe将只创建同一程序的2个实例)
答案 0 :(得分:2)
我猜你正在为你的一些MPI软件创建某种图形前端。据我所知,你有两种选择。
创建一个单独的Win32应用程序(没有MPI)作为您的GUI,让这个应用程序运行“mpiexec”或等效的正确参数,以便在用户请求时启动应用程序。
您需要确保只在一个MPI实例上启动GUI。您可以通过在启动期间从MPI查找当前程序的ID来执行此操作,如果它是0,则启动GUI。
这样的事情:
int main(int argc, char** argv){
int myid;
...
MPI_Init(&argc, &argv);
...
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
if(myid == 0){
launchGui();
}else{
waitForAndProcessMessages();
}
...
MPI_Finalize();
return 0;
}
显然,您仍然需要填充所有位以使MPI正常运行,但在此示例中,第一个启动的实例将成为GUI而不进行任何处理。稍后加入HPC的任何实例都将等待消息并处理它们,直到它们终止。
答案 1 :(得分:0)
点击“运行”按钮后,我想创建2个帖子“
既然你有VS 2010,我不确定std :: thread兼容性。您可以使用MFC's threading API,如下所示 -
CWinThread* myThread = AfxBeginThread(myThreadFunc, &threadInfoStruct);
您可以使用PostThreadMessage
API在各种MFC线程之间传递信息,即从GUI到业务逻辑,从而传入MPI线程并返回。
当然,如果您的编译器支持std::thread
,那么就可以了。
与std::thread
相关,通常最实用的方法是使用std::async
。阅读 Effective Modern C ++ 中有关基于线程的编程与基于任务的编程的相关内容。