Newsgroup: it.comp.lang.visual-basic
Titolo: Come capire se un prog. lanciato con Shell è terminato?

Ciao a tutti,
quello che devo fare, semplificando molto, è questo:
1) creare con Access un file PRIMO.TXT che contiene dei dati
2) lanciare un programma DOS (con la funzione Shell) che esegue dei
calcoli con i dati letti dal file PRIMO.TXT, scrivendo i risultati nel
file
SECONDO.TXT
3) lanciare un secondo programma DOS (sempre con Shell) che legga dal file
SECONDO.TXT e faccia delle operazioni di conseguenza.
Problema: come fare in modo che il secondo programma parta solo quando il
primo ha finito l'elaborazione e chiuso il file PRIMO.TXT ?
Facendo:
Creazione file PRIMO.TXT
Shell "prog1"  'crea il file SECONDO.TXT
Shell "prog2"  'legge dal file SECONDO.TXT
succede che prog2 parte immediatamente dopo prog1, e va a leggere da un
file che prog1 non ha ancora finito di creare.
ps:
- non conosco a priori i tempi di elaborazione, non posso inserire quindi
pause fisse
- non posso cambiare la sequenza delle operazioni descritte.
Una soluzione non molto elegante che mi viene in mente è di creare un file
BAT che chiama prog1 e prog2, e richiamarlo da Access, in modo che si
abbia un'esecuzione sequenziale e non in parallelo, però è possibile che
non si
riesca a capire quando un EXE chiamato con Shell sia terminato? Serve a
qualcosa l'ID del task del programma avviato restituito da Shell?
In alternativa come si può verificare se un file è stato scritto
completamente, prima di iniziarne la lettura?
Risposte anche in e-mail     
har...@freenet.hut.fi
   grazie :)
Ciao, AntoGal.

 primo ha finito l'elaborazione e chiuso il file PRIMO.TXT ?
... 

 [...]
I meccanismi a disposizione sono MOLTO diversi a seconda
se sviluppi a 16 (win 3.x, Access 2.0) o 32 bit. Meglio se
specifichi.
        _                ________________________________
R1100RS/ /R80GS          Louis Cretier - 
lcre...@show.it
   ___/ /____            
http://www.show.it/moto/home.htm
__/  | __ ___)
   (_|(__)   "Un buon viaggiatore
______(__)    non segue le vie tracciate" (Daodejing, 27)

 


specifichi.
32 bit (Win95 OSR2) e Access 97
Qualche soluzione?
Ciao :)

 hProcess non termina. Ciao.

 
Devi ricorrere all'uso delle API Windows in particolare alla
GETMODULEUSAGE:
1) Dichiarare la funzione con:
	Declare Function GetModuleUsage Lib "Kernel" (ByVal hModule As Integer) As
Integer
2) Il controllo invece può essere effettuato nel modo seguente:
 
  IdTask = Shell("..........")   ' Esecuzione pgm.1
'** Aspetta fino a quando pgm.1 è attivo 
  RetCode = 1
    Do While Retcode > 0
    RetCode = GetModuleUsage (IdTask)
  Loop
'**
dove ReTCode è un Integer!!!

 Ciao, AntoGal.
La funzione Shell del VB ritorna un ID di processo, utilizzando questo
ID e alcune funzioni API è possibile "congelare" il programma padre in
attesa che il programma filgio sia terminato. Si dovranno utilizzare le
funzioni API OpenProcess, WaitForSingleObject, CloseHandle e
TaskFromInst, per la dichiarazione di queste utilizza il Visualizzatore
API.
Sub Esegui(sExe as String)
    Dim hProg As Long
    hProg = Shell(sExe, vbNormalFocus)
    WaitOnProgram hProg
End Sub
Sub WaiOnProgram(idProg as Long)
    #If Win32 Then
        Dim hProc As Long, iRet As Long
        hProc = OpenProcess(PROCESS_ALL_ACCESS, False, idProg)
        If hProc <> vbNull Then
            iRet = WaitForSingleObject(hProc, INFINITE)
            CloseHandle hProc
        End If
    #Else
        Do While TaskFromInst(idProg)
            DoEvents
        Loop
    #End If
End Sub
Se non si vuole aspettare senza far nulla ma comunque si vuole
controllare quando l'applicazione figlio ha finito si puo usare la
funzione di seguito:
Function IsRunning(idProg) As Boolean
    #If Win32 Then
        Dim hProc As Long, iRet As Long
        hProc = OpenProcess(PROCESS_QUERY_INFORMATION, False, idProg)
        If hProc <> vbNull Then GetExitCodeProcess hProc, iRet
        IsRunning = (iRet = STILL_ACTIVE)
        CloseHandle hProc
    #Else
        isRunning = TaskFromInst(idProg)
    #End If
End Function
In questa bisognerà dichiarare anche la funzione API GetExitCodeProcess.
--
Centro Studi Informatica di Danilo Priore
Via Pio VII, 9 - 00163 - Rome - Italy
Phone: (06) 66.40.052
Mobile Phone: (0335) 63.87.643
P.IVA 10149810581 Iscr. CCIAA 841531
e-mail: 
pri...@infocenter.it
URL: 
http://www.infocenter.it/priore