|
|
|
Хелп! Ожидание конца выполения внешней программы!
|
|||
|---|---|---|---|
|
#18+
Вообщем, я в функции записываю значения переменных в .txt файл, затем запускаю внешний экзешник, которым читаю из этого файла переменные, выполняю расчет и записываю в др. текстовый файл результат. Далее читаю этот результат. Если все это выполнять в одной функции: 1. запись в txt1 2. запуск exe -> запись в txt2 3. чтение из txt2 то получается, что 3-ий пункт выполняется до того как закончит выполняться 2-ой пункт. Помогите пжлста. Я сие реализовал так (нашел в форуме): Private Const INFINITE = &HFFFF Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Private Declare Function OpenProcess Lib "kernel32" (ByVal dwAccess As Long, ByVal fInherit As Integer, ByVal hObject As Long) As Long Public Sub WaitForProcessToEnd(cmdLine As String) 'You can substitute a discrete time 'value in milliseconds for INFINITE. Dim retVal As Long, pID As Long, pHandle As Long pID = Shell(cmdLine, 0) pHandle = OpenProcess(&H100000, True, pID) retVal = WaitForSingleObject(pHandle, INFINITE) End Sub Private Sub BtnCalcNewRollAdjustment_Click() 'запись в файл ........ 'конец записи в файл WaitForProcessToEnd Dir + "PravkaProekt.exe" 'чтение из файла ........ 'конец чтения из файла End Sub Проблема здесь в том, что программа крутиться в компе круглосуточно и запускается эта фукнкция раз в 5 мин. Получается так, что чем большее кол-во раз ее запускают тем дольше приходится ждать окончания выполнения exe-файла. Приходится перезапускать комп примерно раз в сутки. Подскажите, что здесь не так? или как это реализовать по другому, более надежно? Реально exe-файл выполняется 1-3сек, но запуская его таким образом получается от 5сек до 5мин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 11:20 |
|
||
|
Хелп! Ожидание конца выполения внешней программы!
|
|||
|---|---|---|---|
|
#18+
Да, и все это делается в VBA. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 11:23 |
|
||
|
Хелп! Ожидание конца выполения внешней программы!
|
|||
|---|---|---|---|
|
#18+
а вы проверяйте доступность txt2 Здесь на форуме недавно была такая тема (про доступность) I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 13:31 |
|
||
|
Хелп! Ожидание конца выполения внешней программы!
|
|||
|---|---|---|---|
|
#18+
да нет.... это мне надо сделать, чтоб сначала екзешник, запущенный изи VBA, выполнился и записал в txt2, а потом уже VBA прочитал из txt2. а то иначе получается, что екзешник еще не записал, а VBA уже читает из него! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 14:33 |
|
||
|
Хелп! Ожидание конца выполения внешней программы!
|
|||
|---|---|---|---|
|
#18+
:) сори, не понял ответа.... дело в том, что екзешник может еще не занять txt2, а VBA уже прочитать.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 14:36 |
|
||
|
Хелп! Ожидание конца выполения внешней программы!
|
|||
|---|---|---|---|
|
#18+
zvanya :) сори, не понял ответа.... дело в том, что екзешник может еще не занять txt2, а VBA уже прочитать.... 1)ну если время известно, то можно sleep воткнуть, а уж потом проверять 2) ТХТ2 создается ЕХЕ или он постоянно существует? I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 16:15 |
|
||
|
Хелп! Ожидание конца выполения внешней программы!
|
|||
|---|---|---|---|
|
#18+
А если попробовать использовать семафоры? тынц exe1 создает семафор и запускает exe2 после этого exe1 курит пока семафор существует exe2 выполняет свои действия и убирает семафор exe1 видит что семафора нет, значит exe2 сделала все свои действия, значит можно работать дальше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 16:37 |
|
||
|
Хелп! Ожидание конца выполения внешней программы!
|
|||
|---|---|---|---|
|
#18+
Попробуй так Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Function DelayShell(Path As String) As String Dim hKey As Long, hOpen As Long, hExit As Long hKey = Shell(Path, vbHide) hOpen = OpenProcess(KEY_DIAL, True, hKey) Do Call GetExitCodeProcess(hOpen, hExit) DoEvents Loop Until hExit <> STILL_ACTIVE DelayShell = "Команда выполнена " & Path End Function ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 17:10 |
|
||
|
Хелп! Ожидание конца выполения внешней программы!
|
|||
|---|---|---|---|
|
#18+
zvanyaПроблема здесь в том, что программа крутиться в компе круглосуточно и запускается эта фукнкция раз в 5 мин. Получается так, что чем большее кол-во раз ее запускают тем дольше приходится ждать окончания выполнения exe-файла. Приходится перезапускать комп примерно раз в сутки. Подскажите, что здесь не так? или как это реализовать по другому, более надежно? Реально exe-файл выполняется 1-3сек, но запуская его таким образом получается от 5сек до 5мин. Не нужно использовать VBA для круглосуточных задач. В том что оно постепенно замедляется нет ничего удивительного, просто там кривая работа с памятью. Перепеши процедуру формирования исходного txt, запуска чужой программы и дешифрацию полученого txt2 на что-нибудь более машино-дружелюбное, хотя бы на VB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2007, 17:42 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=60&tid=2164653]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
194ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
| others: | 240ms |
| total: | 533ms |

| 0 / 0 |
