Oppure

Loading
04/10/11 15:25
Se i processi fanno solamente elaborazione su dati in ingresso e restituiscono dei valori in uscita allora i processi non devono essere per forza dotati di GUI.

In ogni caso, essendo processi diversi, per farli dialogare devi utilizzare uno dei diversi metodi standard di dialogo interprocesso (IPC)

en.wikipedia.org/wiki/…

Ovviamente è anche necessario la gestione della sincronizzazione tra i processi in modo che il primo attenda che tutti gli altri hanno terminato (WaitForMultipleObjects).
04/10/11 16:00
cosemale
innanzitutto grazie per la disponibilità!

Ti ho fatto un esempio molto semplificato per farti capire al meglio ciò che voglio fare.
In realta la mia applicazione fa altro e deve essere per forza una GUI.

Ho letto quello che mi hai postato...ma non sono riuscito a trovare una soluzione.
Innanzitutto è possibile fare ciò che sto chiedendo????

O è un utopia?
aaa
04/10/11 17:08
Sì che è possibile. E' un classico scenario multiprocesso (anche se io avrei scelto i thread ... non so, molto probabilmente è possibile ma bisognerebbe vedere un po' meglio il problema, non genericamente, ma nei dettagli precisi).

04/10/11 17:35
cosemale
Questo è quello che devo fare:
Il padre passa da linea di comando al figlio il parametro 9.
Il figlio prende il parametro in input fa la radice quadrata e ritorna il risultato al padre.
Come posso fare???avete un esempio?

PADRE:
void _tmain( int argc, TCHAR *argv[] )
{
    char buff[50];
    BOOL result;
PROCESS_INFORMATION processInformation1;
STARTUPINFO startupInfo;
    int *x;
memset(&processInformation1, 0, sizeof(processInformation1));

    memset(&startupInfo, 0, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);

    TCHAR *AppName2 = L"C:\Square.exe";
    TCHAR *CmdLine = L"9";
    
    TCHAR tempCmdLine[MAX_PATH * 2];
    _tcscpy_s(tempCmdLine, MAX_PATH *2, CmdLine);

    result =:: CreateProcess(AppName2,tempCmdLine , NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startupInfo, &processInformation1);
    
    if (result == 0)
{
         wprintf(L"ERROR: CreateProcess failed!";);
}
    else
    {
        WaitForSingleObject( processInformation1.hProcess, INFINITE );
        CloseHandle( processInformation1.hProcess );
        CloseHandle( processInformation1.hThread );    
    }
}

CHILD
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
    // TODO: Place code here.
    MSG msg;
    //MessageBox(NULL, lpCmdLine, "Command Line", MB_OK);
    LPTSTR *szArgList;
    int argCount;
    szArgList = CommandLineToArgvW(GetCommandLine(), &argCount);

    for (int i = 0; i < argCount; i++)
        MessageBox(NULL, szArgList[i], L"Arglist contents", MB_OK);
    
    //PRENDI IL PARAMETRO 9 FAI LA RADICE QUADRATA E MANDALO AL PADRE
aaa
04/10/11 19:41
Ad esempio, come ti dicevo, puoi usare la Shared Memory.
Nel primo codice, prima della CreateProcess

    HANDLE hShaBase = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4096, L"__SharedAreaUniqueName_");
    double *pShaBase = (double *)MapViewOfFile(hShaBase, FILE_MAP_WRITE, 0, 0, 4096);


e dopo la seconda CloseHandle

    double result = *pShaBase;

    wchar_t buffer[32];
    swprintf(buffer, 32, L"%g", result);
    MessageBox(NULL, buffer, L"Result", 0);

    UnmapViewOfFile(pShaBase);
    CloseHandle(hShaBase);


Nel codice del figlio invece, dopo l'acquisizione dei parametri in input

    HANDLE hShaBase = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4096, L"__SharedAreaUniqueName_");
    double *pShaBase = (double *)MapViewOfFile(hShaBase, FILE_MAP_WRITE, 0, 0, 4096);

    LPTSTR endPtr;
    double dValue = _tcstod(szArgList[0], &endPtr);
    *pShaBase = sqrt(dValue);

    UnmapViewOfFile(pShaBase);
    CloseHandle(hShaBase);


Nel codice che ti mostro mancano i controlli sugli eventuali errori che le chiamate alle funzioni possono generare. Li aggiungerai tu, se credi.
05/10/11 13:52
cosemale
Ti ringrazio tantissimo era quello che volevo.
Su suggerimento tuo ho letto la relativa documentazione.

Grazie
aaa
05/10/11 14:19
Postato originariamente da cosemale:

Ti ringrazio tantissimo era quello che volevo.
Su suggerimento tuo ho letto la relativa documentazione.

Grazie


Prego ... di nulla ...

Se vuoi, puoi evitare di passare i dati sulla linea di comando e usi lo stesso buffer allocato per l'output (che è di 4 K).
Ultima modifica effettuata da 05/10/11 14:21