Witam !
Mam problem z funkcją CreateProcess. Mianowicie założenie jest takie, aby polecenia z pliku *.bat podane jako parametr były wykonywane po kolei na argv[2] procesach. Polecenia zapisane są linijka po linijce, tak aby pobierać linijkę z pliku *.bat, zapisywać ją w tablicy stringów, a później aby jeden proces mógł ją wykonać. Jeżeli plik *.bat ma 90 linijek, a my chcemy aby pracowało 10 procesów równolegle to tak będzie. Niestety nie wiem co robię źle. Błąd jaki dostaję to: 0x2, co oznacza: **The system cannot find the file specified. ** Wszystko pięknie ale nie wiem do czego to się odwołuje. Aktualnie program ma instrukcje jakie ma wykonać w tablicy stringów, ale niestety CreatProcess ich nie wykonuje. Polecenia mają być wykonywane w konsoli [cmd.exe]
Mój kod:
// threads.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <string>
#include <fstream>
#include <process.h>
#include <cstdlib>
#include <sstream>
#include <Windows.h>
using namespace std;
bool fileExists (const string& fileName)
{
fstream plik;
plik.open(fileName.c_str(), ios::in);
if ( plik.is_open() )
{
printf("Plik istnieje.\n");
plik.close();
return true;
}
printf("Plik nie istnieje.\n");
plik.close();
return false;
}
int main(int argc, char* argv[])
{
int iNumOfProcesses;
string linia;
int iNumOfLines = 1;
bool check;
int iNumOfFors;
int temp;
int startAtLine = 0;
int i = 0;
int j;
if(argc!= 3)
{
cout << "Error: Za malo argumentow!\n";
getchar();
return -1;
}
while( atoi(argv[2]) == 0 || atoi(argv[2]) > 30)
{
cout << "Nie poprawny argument drugi. " <<endl;
cout << "Argument drugi powinien byc z przedzialu <1 , 30> " << endl;
}
iNumOfProcesses = abs(atoi(argv[2]));
check = fileExists(argv[1]);
fstream plik;
plik.open(argv[1], ios::in);
while(!plik.eof())
{
getline(plik, linia);
iNumOfLines = iNumOfLines + 1;
}
plik.close();
string *polecenia = new string[iNumOfLines];
plik.open(argv[1], ios::in);
while(!plik.eof())
{
getline(plik, linia);
polecenia[i] = linia;
//cout << linia << endl;
//cout << polecenia[i] << endl;
i = i + 1;
}
plik.close();
cout << "Ilosc lini w pliku " << argv[1] << " : " << iNumOfLines << endl;
PROCESS_INFORMATION *pi = new PROCESS_INFORMATION[iNumOfProcesses];
HANDLE *hThreadArray = new HANDLE[iNumOfProcesses];
STARTUPINFO si = {0};
ZeroMemory(&si, sizeof(si));
int *pi_index = new int[iNumOfProcesses];
for(i=0; i<iNumOfProcesses; i++)
{
ZeroMemory(&pi[i], sizeof(pi[i]));
}
si.cb = sizeof(si);
j = 0;
iNumOfFors = iNumOfLines / iNumOfProcesses;
temp = iNumOfLines - ((int)iNumOfFors * iNumOfProcesses);
startAtLine = iNumOfLines - temp;
while( j < (int)iNumOfFors)
{
for(i = 0; i < iNumOfProcesses; i++)
{
pi_index[i] = CreateProcess((LPCWSTR)polecenia[i+(iNumOfProcesses * j)].c_str(), _T(""), 0, 0, 0, 0, 0, 0, &si, &pi[i]);
//cout << GetLastError() << endl;
hThreadArray[i] = pi[i].hProcess;
}
WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, hThreadArray, TRUE, INFINITE);
for(i = 0; i < iNumOfProcesses; i++)
{
CloseHandle(pi[i].hProcess);
CloseHandle(pi[i].hThread);
}
j = j + 1;
}
j = 0;
Sleep(1000);
if(temp > 1 )
{
while(j < temp)
{
for(i = 0 ; i < temp; i++)
{
pi_index[i] = CreateProcess((LPCWSTR)polecenia[i+startAtLine].c_str(), _T(""), 0, 0, 0, 0, 0, 0, &si, &pi[i]);
hThreadArray[i] = pi[i].hProcess;
}
WaitForMultipleObjects(MAXIMUM_WAIT_OBJECTS, hThreadArray, TRUE, INFINITE);
for(i = 0; i < temp; i++)
{
CloseHandle(pi[i].hProcess);
CloseHandle(pi[i].hThread);
}
j = j + 1;
}
}
delete[] pi, pi_index, hThreadArray, polecenia;
cout << "Konczenie programu\n";
//system("Pause");
return 0;
}