View Full Version : [VC++] Mancato aggiornamento se metto in attesa il programma
Ho un problema, sto realizzando una applicazione in VC++ dialog based. Ho la necessità di eseguire un programma esterno (un programma che si esegue nel prompt dei comandi) mettendo in attesa il programma principale.
Il mio problema sta nel fatto che prima della partenza del programma si deve aggiornare la finestra di dialogo, ma questo non avviene.
Cioè se scrivo
m_messaggio="Questo messaggio deve essere visualizzato prima dell'esecuzione del programma");
UpdateData(FALSE);
SHELLEXECUTEINFO shExecInfo;
shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
shExecInfo.hwnd = NULL;
shExecInfo.lpVerb = NULL;
shExecInfo.lpFile = "programma.exe";
shExecInfo.lpParameters = NULL;
shExecInfo.lpDirectory = NULL;
shExecInfo.nShow = SW_HIDE;
shExecInfo.hInstApp = NULL;
if(!ShellExecuteEx(&shExecInfo))
{
AfxMessageBox("Errore nell'esecuzione !!!");
return;
}
WaitForSingleObject(shExecInfo.hProcess, INFINITE);
La finestra di dialogo viene aggiornata solo dopo l'esecuzione del programma.
Come risolvo questo problema?
Grazie
quando è bloccato sul wait, il programma accoda tutti i messaggi inviati alla finestra nella coda, ma non vegono processati fino al ritorno della funzione
per fare quello che vuoi fare dovresti crearti un thread parallelo che esegua il programma e ne monitori lo stato, tenendo così libera la coda dei messaggi
Prova a forzare il ridisegno della finestra... Usa RedrawWindow...
se usa la WaitForSingleObject non può eseguire altre operazioni, è come se fosse bloccato in un getch
Prima di WaitForSingleObject... Altrimenti può sempre usare un thread e fare la WaitForSingleObjcet da quel thread...con le ovvie precauzioni...
e io che ho detto? :p
oppure...
while(WaitForSingleObject(shExecInfo.hProcess, 1000) == WAIT_TIMEOUT)
{
// rinfresco il dialogo
}
// se sei qui il processo ha terminato
l'ultima soluzione non funziona...
Scusate ma sono abbastanza ignorante in materia... se potete fornirmi degli esempi..
Rispiego il problema, probabilmente qualcuno può fornirmi una soluzione:
ho un programma dialog based che deve lanciare una applicazione dal prompt dei comandi. Questa applicazione al temine scrive un file di testo. Questo file di testo deve essere letto dal programma principale. Quindi il programma principale deve per forza aspettare che il programma figlio termina.
Quando però lancia il programma, deve aggiornare la finestra di dialogo con una scritta.
Il problema che se metto in attesa il programma principale con WaitForSingleObject la finestra non si aggiorna più.
qualcuno mi ha parlato di creare thread paralleli, ma come si fa??
vi prego, se potete fornitemi degli esempi.
...se non trovo la soluzione non mi laureo più.... :cry:
Quello che ti ha detto ri dovrebbe funzionare (l'attesa non è infinta, ma hai provato comunque con RedrawWindow prima di chiamare WaiForSingleObject ?
si ho provato RedrawWindow, ma che parametri devo passare?
Ho usato solo RedrawWindow();
il while va bene solo se lo incapsuli in un thread... questo perchè se lo fai all'interno della funzione ti tiene bloccata la coda dei messaggi... tutti i tuoi redraw vengono accodati ma mai eseguiti fino al termine della funzione che li ha richiamati
per non creare un thread puoi usare il TIMER del dialogo, e invece di fare un while usare un if, in quel modo non blocchi la coda dei messaggi e i redraw possono essere processati
grazie per la risposta, ma purtroppo non so come si usano i TIMER di cui mi parli.
Mi puoi fare un esempio,
grazie infinite
nell'InitDialog:
#define ID_EVENTO 1234
SetTimer(ID_EVENTO, 1000); // ogni 1s
nel class wizard intercetta il messaggio WM_TIMER
quindi nell'OnTimer:
if(WaitForSingleObject(shExecInfo.hProcess, 1000) == WAIT_TIMEOUT)
{
// rinfresco il dialogo
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.