Windows — запустить несколько копий некоторых программ из программы на C ++

Что мне нужно сделать, это бежать (например) 6 копий (независимые процессы) Example.exe (что также является моей программой) с другими аргументами командной строки из моей основной программы. Эти копии должны работать на в то же время. Я использую такой код:

    const int NumberOfProcesses= 6;
STARTUPINFO si[NumberOfProcesses];
PROCESS_INFORMATION pi[NumberOfProcesses];srand((unsigned)time(NULL));

for(int i=0;i<NumberOfProcesses;i++)
{
char fname[MAX_PATH];
strncpy(fname,"\"",1);
fname[1] = '\0';
strcat(fname,"d:\\test\\example.exe");
strcat(fname,"\"");
int id = i;
strcat(fname," ");
strcat(fname,(std::to_string(id)).c_str());
int count = (rand()%1000) + 1;
strcat(fname," ");
strcat(fname,(std::to_string(count)).c_str());
int lb = 13;
strcat(fname," ");
strcat(fname,(std::to_string(lb)).c_str());
int ub = 666;
strcat(fname," ");
strcat(fname,(std::to_string(ub)).c_str());
printf(fname);
cout<<"\n";

//Here in fname I have correct command, that runs properly
bool t = false;
t=CreateProcess( NULL,   // No module name (use command line)
(LPSTR)fname,        // Command line CharToLPWSTR(fname2)
NULL,           // Process handle not inheritable
NULL,           // Thread handle not inheritable
FALSE,          // Set handle inheritance to FALSE
0,              // No creation flags
NULL,           // Use parent's environment block
NULL,           // Use parent's starting directory
&si[i],            // Pointer to STARTUPINFO structure
&pi[i] );           // Pointer to PROCESS_INFORMATION structure
}

Так что если NumberOfProcesses == 0, он будет работать «d: \ test \ example.exe» 1 2 3 4 от Fname. Но если NumberOfProcesses == 6 (или что-то еще), нулевая итерация завершится правильно, а другие вернут false. Иногда 4-я итерация проходит правильно.

Я думаю, что это потому, что при нулевой итерации «d: \ test \ example.exe» 1 2 3 4 Example.exe занят и не может быть запущен еще раз. Поэтому я изменил код на это:

 bool t = false;

getchar();
for(int i=0;i<5;i++)
{

t=CreateProcess( NULL,   // No module name (use command line)
(LPSTR)fname,        // Command line CharToLPWSTR(fname2)
NULL,           // Process handle not inheritable
NULL,           // Thread handle not inheritable
FALSE,          // Set handle inheritance to FALSE
0,              // No creation flags
NULL,           // Use parent's environment block
NULL,           // Use parent's starting directory
&si[i],            // Pointer to STARTUPINFO structure
&pi[i] );           // Pointer to PROCESS_INFORMATION structure
if(t) break;
}

Таким образом, я получил некоторую задержку между запуском example.exe — и это помог. Все 6 копий начинаются и заканчиваются, но они не работают параллельно (у меня есть выход из example.exe).
Но я не хочу, чтобы моя программа работала.

Как я могу избежать этой проблемы?
Благодарю.

UPD.
Согласно ответу Вернера Хенце, я просто добавил пару строк ( инициализировать STURTUPINFO) в петлю

const int NumberOfProcesses= 6;
STARTUPINFO si[NumberOfProcesses];
PROCESS_INFORMATION pi[NumberOfProcesses];
for(int i=0;i<NumberOfProcesses;i++)
{
///Next two lines is important

ZeroMemory( &si[i], sizeof(si[i]) );
si[i].cb = sizeof(si);

/*Some actions*/

t=CreateProcess( NULL,   // No module name (use command line)
(LPSTR)fname,        // Command line CharToLPWSTR(fname2)
NULL,           // Process handle not inheritable
NULL,           // Thread handle not inheritable
FALSE,          // Set handle inheritance to FALSE
0,              // No creation flags
NULL,           // Use parent's environment block
NULL,           // Use parent's starting directory
&si[i],            // Pointer to STARTUPINFO structure
&pi[i] );           // Pointer to PROCESS_INFORMATION structure
}

И теперь это нормально.
Еще раз спасибо.

0

Решение

В случаях, когда CreateProcess возвращает FALSE, вы должны проверить GetLastError (). В опубликованном вами коде вы не инициализируете массив si. STARUPINFO является входным параметром для CreateProcess, поэтому вы должны инициализировать его перед передачей в CreateProcess.

Я полагаю, что example.exe работает так быстро, что они заканчиваются, прежде чем вы их просматриваете. Если вы напечатаете значение времени, например GetTickCount (), после каждого CreateProcess, вы увидите, что все вызовы CreateProcess происходят очень быстро.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector