【发布时间】:2016-03-18 01:35:45
【问题描述】:
我正在编写一个 Windows 窗体程序 (C++/CLI),它在一个大的“for”循环中多次调用可执行程序。我想并行调用可执行文件,因为运行一次最多需要一分钟。
windows窗体代码的关键部分是大的for循环(实际上是2个循环):
for (int a=0; a<1000; a++){
for (int b=0; b<100; b++){
int run = a*100 + b;
char startstr[50], configstr[50]; strcpy(startstr, "solver.exe");
sprintf(configstr, " %d %d %d", run, a, b);
strcat(startstr, configstr);
CreateProcessA(NULL, startstr,......) ;
}
}
solver.exe 程序使用整数“run”、“a”和“b”。 “运行”用于从每个程序运行中写入一个唯一的输出文本文件。 “a”和“b”是用于读取特定输入文本文件的数字。这些并不是每次运行所独有的。
我不在每次调用“CreateProcess”后等待,因为我希望这些并行执行。
目前我的代码正在运行并且似乎可以正常工作。但是,它会同时处理大量solver.exe 程序实例,导致我的计算机变得非常缓慢,直到一切都完成。
我的问题是,如何创建一个队列来限制并发进程的数量(例如机器上的物理内核数量),以便它们不会都尝试同时运行?当 for 循环设置得更大时,内存也可能是一个问题。
第二个问题是,solver.exe 的不同实例潜在的并发文件读取是否会产生问题? (我可以解决这个问题,但如果我不需要,我不想这样做。)
我熟悉 openmp 和 C,但这是我第一次尝试在 Windows 窗体程序中运行并行进程。
谢谢
【问题讨论】:
-
这必须是单独的 .exe 吗?如果您控制求解器代码,如果它是一个 DLL,它会更容易。
-
"solver.exe 的不同实例读取潜在的并发文件会产生问题吗?"这取决于 - 如果它只是在读取,那么只要确保不以任何方式锁定文件就可以了。
-
无论如何,这可能是重复的。看看这个,看看它是否符合您的需求:stackoverflow.com/questions/42531/…
-
题外话:使用
std::stringstream可以省去很多麻烦。std::stringstream startstr; startstr <<"solver.exe "<< run << ' ' << a << ' ' << b; CreateProcessA(NULL, startstr.str().c_str(),......) ; -
是的,文件只是读取而不是写入。
标签: windows c++-cli command-line-interface createprocess