PDA

View Full Version : [C] creazione processi multipli da programma padre


mfonz85
28-11-2006, 18:15
Ciao a tutti,
sto scrivendo un programmino che serve a semplificarmi la vita per la conversione e l'ordine di file mp3.
Questo programma prende in input una cartella qualsiasi e crea in un'altra cartella di output la stessa directory tree della cartella di partenza, copiandoci eventualmente sopra i file mp3 ri-codificati usando il ben noto LAME 3.97
Ora, il mio programma funziona molto bene, e riesco a far partire il processo LAME.exe tramite questa funzione, alla quale passo una stringa contenente "lame -h --abr 112 #FILE INPUT# #FILE OUTPUT#" per fare in modo che il LAME stesso crei un mp3 ri-codificato con bitrate medio sui 112kbps:

void startNewLameProcess(char* fullParString)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

if( !CreateProcess(
NULL,
TEXT(fullParString),
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi )
)

{
printf("Creazione processo fallita... (%d).\n", GetLastError() );
return;
}

WaitForSingleObject( pi.hProcess, INFINITE );

DWORD dwExitCode = 0;

GetExitCodeProcess(pi.hProcess, &dwExitCode);

if(dwExitCode == STILL_ACTIVE) {
TerminateProcess(pi.hProcess, 0);
}

CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}


Ora, la mia domanda è questa: se ho un processore Dual Core, spreco tempo perchè potrei tranquillamente tenere 2 istanze del LAME aperte contemporaneamente, ognuna affibbiata ad 1 singolo processore...
E' possibile effettuare questa operazione anche sul mio programma, anche utilizzando le API di windows???
Oppure posso tenere solo 1 istanza del LAME.exe, aspettare che termini, e poi iniziarne un'altra?
In questo caso, esiste una sorta di ottimizzazione per i sistemi dual/quad core?
Grazie anticipatamente :D

andbin
28-11-2006, 19:57
In questo caso, esiste una sorta di ottimizzazione per i sistemi dual/quad core?Guarda le seguenti funzioni Win32: SetProcessAffinityMask() e GetProcessAffinityMask(). In più, per i thread: SetThreadAffinityMask()

Inoltre: GetSystemInfo() per sapere quanti processori ci sono.

E se hai modo di usarle in modo interessante ... raccontacelo! Io personalmente non ho ancora avuto modo di mettere mano su un sistema dual-core. :(

mfonz85
28-11-2006, 21:25
Guarda le seguenti funzioni Win32: SetProcessAffinityMask() e GetProcessAffinityMask(). In più, per i thread: SetThreadAffinityMask()

Inoltre: GetSystemInfo() per sapere quanti processori ci sono.

E se hai modo di usarle in modo interessante ... raccontacelo! Io personalmente non ho ancora avuto modo di mettere mano su un sistema dual-core. :(

Accidenti, sarà meglio che mi legga qualche codice d'esempio altrimenti mi perdo tra i thread :D
TI farò sapere qualcosa di più domani, dopo un pò di testing :D