Jak naprogramovat aby VB počkal na ukončení aplikace spuštěné pomocí SHELL??   zodpovězená otázka

VB6/VBA

Zdravim, ve Visual Basicu už nějakou dobu dělám, ale pořád se považuju za začátečníka. Nyní jsem narazil na určitý problém se kterým nemůžu už pěkných pár dní pohnout. VE VB jsem vytvořil skript pomocí kterého ovládám určitý software program (výpočtářský). Z tohoto softwaru vyexportuji výpočtový model, který je nutné načíst do jiného výpočtového softwaru. Po jeho načtení se spustí výpočet, který trvá mezi 10 sekundami a klidně 5 hodinami-dle náročnosti. Po dokončení výpočtu se výsledky načitají zpět do programu ze kterého byly vyexportovány. To je vše. Problém mám s tím, že jak ten můj skript běží pořád dál, tak jaksi nepočká až ta analýza skončí a žádné výsledky nenačte. Přikládám můj kód. Kdyby mi někdo poradil, budu opravdu vděčný.

Option Explicit
Sub SpusteniVypoctu()

    Dim femap As Object
    Set femap = GetObject(, "femap.model")
    Dim anal As Object
    Dim analID As Long
    Dim name As String
    Dim rc As Long
    Set anal = femap.feAnalysisMgr
    Dim Degradace As String
    Dim i As Long
    Dim Runanal As Long
    Dim cmdline As String
       
    anal.Title = "Static Analysis"
    anal.Solver = 31
    anal.AnalysisType = 1
    anal.BCSet(0) = 1
    anal.BCSet(2) = 1
    anal.output(0) = -1
    anal.output(1) = -1
    anal.output(2) = -1
    anal.output(8) = -1
    anal.output(15) = -1
    anal.output(16) = -1
    anal.CornerOutput = -1
    analID = 3
    anal.Put (analID)
 ' '''Až sem to mám zmáknutý '''     
    
    rc = femap.feFileWriteNastran(1, "Degradace.nas")   ''''Vyexportuje z prvního softu soubor Degradace.nas'''
    
    cmdline = "C:\Program Files\NEiNastran Engine V100\Editor\Editor.exe C:\Users\Michal\Desktop\Export_Import\Degradace.nas"
    Runanal = Shell(cmdline, 0)
 ' Pomocí Shell otevřu soubor ve druhém softu (pro druhý soft se 'soubor chová jako exesoubor a poté to počítá)   
    
    rc = femap.feFileReadNeutral3(0, "Degradace.FNO", False, False, True, False, False, False, 0, False, False, True)
 ' A Načtu zpět do prvního softu - nenačtu nic, protože není spočteno
       
   rc = femap.feAppUpdatePanes(True)

    
End Sub

Díky moc

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Kdysi jsem si stáhnul tento příklad:

Option Explicit

Private Declare Function WaitForSingleObject Lib "kernel32" _

(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" _

(ByVal hObject As Long) As Long

Private Declare Function OpenProcess Lib "kernel32" _

(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _

ByVal dwProcessId As Long) As Long

Private Const INFINITE = -1

Private Const SYNCHRONIZE = &H100000

Private Sub Command1_Click()

Dim iTask As Long, ret As Long, pHandle As Long

iTask = Shell("notepad", vbNormalFocus)

Rem Shell "mplayer.exe /play c:\media\film\urednik.mpe", vbNormalFocus

pHandle = OpenProcess(SYNCHRONIZE, False, iTask)

ret = WaitForSingleObject(pHandle, INFINITE)

ret = CloseHandle(pHandle)

MsgBox "Process Finished!"

End Sub

Luboš

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ahoj, tohle jsem také stahoval, ale nějak mi to nefungovalo. Sice se opozdil, ale nepočkal na úplné ukončení výpočtu, pouze na jeho rozběhnutí - dle mého názoru.

Nakonec jsem to vyřešil trochu jinak. Po definovaném čase kontroluje, jestli jsou již k dispozici výsledky výpočtu. Pokud nejsou opět čeká. Jakmile to budu mít celé hotové a ověřené, tak sem ten kód vložím.

Nyní mám ale ještě jeden dotaz. Nevěděl by náhodou někdo, jak ukončit procesy spuštěné pomocí Shell? Pokud tu analýzu spustím několikrát, tak mi úplně zaseká procesor...?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak už je to pořešené. Musí to projít testováním, ale vypadá to velmi slibně.

Option Explicit
Sub SpusteniVypoctu()
    Dim femap As Object
    Set femap = GetObject(, "femap.model")
    Dim anal As Object
    Dim analID As Long
    Dim name As String
    Dim rc As Long
    Set anal = femap.feAnalysisMgr
    Dim Degradace As String
    Dim i As Long
    Dim Runanal As Long
    Dim cmdline As String
    Dim filetodelete As Object
    Set filetodelete = CreateObject("Scripting.FileSystemObject")
    
    rc = femap.feFileWriteNastran(1, "Degradace.nas")
    
    cmdline = "C:\Program Files\NEi Nastran Engine V101\Editor\Editor.exe C:\Users\Kral\Desktop\Export_Import\Degradace.nas"
    Runanal = Shell(cmdline, 0)
    
    
'______________PAUSE SCRIPT_________________
Dim newHour As Single
Dim newMinute As Single
Dim newSecond As Single
Dim waitTime As Single
Dim Pause As Single
Pause = 5

WAIT:  newHour = Hour(Now())
       newMinute = Minute(Now())
       newSecond = Second(Now()) + Pause
       waitTime = TimeSerial(newHour, newMinute, newSecond)
       Application.WAIT waitTime
       rc = femap.feAppMessage(0, "Waiting For NEiNastran results :( ...")
       rc = femap.feAppUpdatePanes(True)
       
'____________END OF PAUSE SCRIPT_____________


   If Dir("C:\Users\Kral\Desktop\Export_Import\degradace.FNO") <> "" Then
      GoTo CTENI
   Else
      GoTo WAIT
   End If
            
CTENI: rc = femap.feFileReadNeutral3(0, "Degradace.FNO", False, False, True, False, False, False, 0, False, False, True)
    
       filetodelete.DeleteFile ("C:\Users\Kral\Desktop\Export_Import\degradace.FNO")
       
       rc = femap.feAppMessage(0, "New NEiNastran OutputSet has been created ;) ...")
       rc = femap.feAppUpdatePanes(True)
       
'______________EDITOR CLOSE_________________
Dim WMI As Object
Dim objProcesses As Object
Dim objProcess As Object
Set WMI = GetObject("winmgmts:")
    Set objProcesses = WMI.execquery("SELECT * FROM win32_process WHERE Name = 'EDITOR.exe'")
    For Each objProcess In objProcesses
        objProcess.Terminate
    Next
'______________EDITOR CLOSE_________________

End Sub

Díky za pomoc a zdravim

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback