Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WinAPI将多个进程的结果保存到一个文件_C++_Multithreading_Winapi_Multiprocessing - Fatal编程技术网

C++ WinAPI将多个进程的结果保存到一个文件

C++ WinAPI将多个进程的结果保存到一个文件,c++,multithreading,winapi,multiprocessing,C++,Multithreading,Winapi,Multiprocessing,我试图寻找类似的问题,但没有找到。 由于这个问题很难理解,我将尽可能简单地再次解释。 基本上,我有3个C++源文件: 1.MainProcess3args.cpp-正在执行与互斥同步的2个进程,第二个和第三个文件使用CreateProcess()函数运行。Process2应该始终首先运行,并且该部分工作正常。此文件正在接收3个参数-第一个是需要生成多少个数字,第二个是正在运行的进程之间的时间距离,第三个参数定义了进程必须执行的次数。例如MainProcess.exe 2 5 2 第一个参数2-生

我试图寻找类似的问题,但没有找到。 由于这个问题很难理解,我将尽可能简单地再次解释。 基本上,我有3个C++源文件:

1.MainProcess3args.cpp-正在执行与互斥同步的2个进程,第二个和第三个文件使用
CreateProcess()
函数运行。Process2应该始终首先运行,并且该部分工作正常。此文件正在接收3个参数-第一个是需要生成多少个数字,第二个是正在运行的进程之间的时间距离,第三个参数定义了进程必须执行的次数。例如
MainProcess.exe 2 5 2

第一个参数2-生成多少个数字

第二个参数5-下一个数字生成和计算平均值、最小值和最大值之间的时间距离(秒)

第三个参数2——我们生成数字并计算平均值、最小值和最大值的次数

2.Random.cpp生成N个作为参数给定的随机值,并将其保存到RandomValues.txt文件中

3.ReadingRandoms.cpp有3个线程-用于计算RandomValues.txt文件中存储的数字的平均值、最小值和最大值

我想将有关给定参数的信息保存到一个新的txt文件中,并保存每个结果的平均值、最小值和最大值,该文件应如下所示:

Total numbers: 2 | Version:Multithreads | Machine: OEM ID: 9 Processor Type: 8664 | Replies: 2 | Pause: 5
AVG     MIN    MAX
value1 value2 value3
values from next numbers generating...

我有3个源文件,尝试了多种循环组合
for(int I=0;I
Process2应始终首先运行,该部分工作正常。

这里有一个错误。当您在
MainProcess3args.cpp
中挂起
Process1
并首先执行
Process2
时,
Process2
无法读取任何数据,因此您应该先执行
Process1
,然后读取整个Process1

以下代码:

const TCHAR* target1 = _T("C:\\USERS\\Admin\\Documents\\Random3args.exe");
const TCHAR* target2 = _T("C:\\USERS\\Admin\\Documents\\ReadingRandoms3args.exe");
...
CreateProcess(target1, GetCommandLine(), 0, FALSE, 0, CREATE_SUSPENDED, 0, 0, &si1, &pi1);
...
CreateProcess(target2, GetCommandLine(), 0, FALSE, 0, 0, 0, 0, &si2, &pi2);
...
Results << "Total numbers: " << n << " | Version:Multithreads | Machine: OEM ID: " << siSysInfo.dwOemId << " Processor Type: " << siSysInfo.dwProcessorType << " | Replies: " << repeat << " | Pause: " << times;
Results.close();
只需修改为:

const TCHAR* target1 = _T("C:\\USERS\\Admin\\Documents\\ReadingRandoms3args.exe");
const TCHAR* target2 = _T("C:\\USERS\\Admin\\Documents\\Random3args.exe");
...
CreateProcess(target1, GetCommandLine(), 0, FALSE, 0, CREATE_SUSPENDED, 0, 0, &si1, &pi1);
...
CreateProcess(target2, GetCommandLine(), 0, FALSE, 0, 0, 0, 0, &si2, &pi2);
...
这可确保先挂起读取数据的
Process2
,然后执行生成随机数据的过程

源代码中存在一些小问题。在
MainProcess3args.cpp
中,当您完成编写时:

Results << "Total numbers: " << n << " | Version:Multithreads | Machine: OEM ID: " << siSysInfo.dwOemId << " Processor Type: " << siSysInfo.dwProcessorType << " | Replies: " << repeat << " | Pause: " << times;
最后,它对我有效:

编辑:

CreateProcess
都需要传递
GetCommandLine()
参数,否则调用argv[3]时程序将崩溃。我已更改代码

否则,可以使用以下代码输出:

ofstream Results;
Results.open("Results.txt", std::ofstream::out | std::ofstream::app);
if (!Results.is_open())
    cerr << "failed to open file\n";
int repeat = _tstoi(argv[3]);
//cout<<repeat;
Results << endl;
Results << "AVG  " << "MIN  " << "MAX  " << endl;

当repeat大于1时,运行上述代码将导致覆盖先前的
hThreads
句柄,并保存上次创建的线程句柄。必须确保线程句柄在每次循环后正常关闭。

您已经告诉我们您想要什么,并发布了一系列代码,但没有告诉我们您是如何得到的ting和你想要的不同。嗨,我分享了那堆代码来澄清情况和它的样子。我现在得到的结果只是保存在结果文件中的系统信息的一部分。我尝试在MainProcess文件中使用循环,只要迭代变量等于repeat参数,它就会执行过程。我还尝试使用同一个循环从ReadingLandoms文件运行每个线程,但它以错误的顺序运行线程。在代码中,您在线程执行的哪个位置施加任何顺序?我在MainProcess文件中对该片段进行了注释,因为该循环工作不正常-它以正确的顺序运行进程,但未保存系统信息和results right to Result.txt文件循环是
for(int i=0;iHi:)谢谢你的回答。此时我无法访问我的笔记本电脑,下班后将检查它并回答:)如上所述修改代码,运行它,它只显示第一个挂起进程“ReadingLandoms”的输出。我尝试在命令行中输出“ReadingRandoms”结果和“Random”结果,这些结果显示在argv[2]时间距离和argv[3]时间范围内。这就是为什么我第一次尝试使用循环,它用argv重复执行进程[3]次。我想出了一个主意,通过process2源文件将有关系统和线程结果的信息写入结果文件,虽然此方法也没有执行process2。@wiki11ful我编辑了我的答案,还有一些代码建议供您参考。我现在可以看到您的评论@Zhu Song,并且我已经设法将所有需要的内容保存到文件中。我将代码的这一部分移动到ReadingLandoms文件中,现在可以工作了:)
Results << "Total numbers: " << n << " | Version:Multithreads | Machine: OEM ID: " << siSysInfo.dwOemId << " Processor Type: " << siSysInfo.dwProcessorType << " | Replies: " << repeat << " | Pause: " << times;
Results << "Total numbers: " << n << " | Version:Multithreads | Machine: OEM ID: " << siSysInfo.dwOemId << " Processor Type: " << siSysInfo.dwProcessorType << " | Replies: " << repeat << " | Pause: " << times;
Results.close();
ofstream Results;
Results.open("Results.txt", std::ofstream::out | std::ofstream::app);
if (!Results.is_open())
    cerr << "failed to open file\n";
int repeat = _tstoi(argv[3]);
//cout<<repeat;
Results << endl;
Results << "AVG  " << "MIN  " << "MAX  " << endl;
for (int i = 0; i < repeat; i++) {
// calculate average of values-first thread
hThreads[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Averages, &hSemaphore, 0, &threadID1);
// finding minimum - second thread
hThreads[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Minimum, &hSemaphore, 0, &threadID2);
// finding maximum - third thread
hThreads[2] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Maximum, &hSemaphore, 0, &threadID3);
}