Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Проверка активности процесса  [new]
antoniony
Member

Откуда: Запорожье
Сообщений: 500
Здравствуйте!

Есть вот такой вот код:
        Set fs = CreateObject("Scripting.FileSystemObject")
        Call fs.CreateTextFile(pass & "1.txt")
        Set fl = fs.GetFile(pass & "1.txt")
        Set tsr = fl.OpenAsTextStream(ForWriting)
        tsr.Write (ReturnStr)
 'а потом там где-то такой
        If Dir(pass & "1.txt") > "" Then
            Kill pass & "1.txt"
        End If


так вот на строке Kill pass & "1.txt" ругается, что нет доступа на удаление, так как файл редактируется. Оно и понятно: строка-то Set tsr = fl.OpenAsTextStream(ForWriting) держит, просто редактирование не всегда выполняется, а после опр.условий. Пожскажите, как проверить активность процесса (ForWriting). Как закрыть этот процесс я знаю:
        tsr.Close
        Set fs = Nothing
        Set fl = Nothing
17 ноя 06, 00:47    [3412427]     Ответить | Цитировать Сообщить модератору
 Re: Проверка активности процесса  [new]
gerra
Member

Откуда:
Сообщений: 71
Аналогичная проблема, только я запускаю разархивацию, затем удаляю архив. У меня между командами Shell и Kill стоит задержка в виде цикла до 10млн, и пока что заменить ничем не смог. Вот такую ссылку скачал из форума:

Dim OShell
Set OShell = CreateObject("WScript.Shell")
Dim DosCommand
DosCommand = Chr(34) & Environ("programfiles") & "\winrar\rar.exe "" a -ep " & rarfile & " " & Environ("tmp") & "\" & filename
DoEvents
Call OShell.Run(DosCommand, 2, True) 'Минимизированное окно с ожиданием
DoEvents

если я правильно понял, эта штука возвращает управление после окончания выполнения задачи в окне, но у меня затыкается на строчке Call OShell.Run... (и ещё неясно, что такое DoEvents)
Утверждалось, что ссылка рабочая. Наверное я что-то недопонял в этой ссылке.

Есть другой вариант, там при вызове Shell контролируется Handle запущенной программы. Как это делается, я тоже понял не до конца, т.к. там есть подпрограмма Form_Timer(), которая ниоткуда не вызывается - но она-то как раз и контролирует процесс. Вот текст ссылки:

Обратите внимание: после проверки не запускается архивация, а открывается форма frmArchiving. Эта форма сделана всплывающей и модальной (лично у меня еще и без заголовка ;), всплывающей в центре экрана. Ее цель - информировать пользователя о том, что идет архивация (пожалуйста, подождите, идет архивация данных, бла, бла, бла ...., красивую анимацию на Flash или видео ;). Ну и конечно, настоящее ее предназначение - запустить и отследить окончание процесса архивации. Вот этот интересный код мы и рассмотрим. Привожу весь код модуля формы, благо, он небольшой, нет смысла его делить на порции:



Option Compare Database
Option Explicit

' для определения завершения программы
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Const STILL_ACTIVE = 259
Const PROCESS_QUERY_INFORMATION = 1024

Private idProg As Long ' удерживаем Handle запущенной нами проги
Private bIsStarted As Boolean

Private Sub Form_Open(Cancel As Integer)
Dim strAppPath As String
' сохраним путь базы
strAppPath = Application.CurrentProject.Path & "\"

' вот тут надо проверить наличие файла WinRar.exe в папке ...\AddOns

' сообщение что не найден архиватор WinRar.exe в папке ...\AddOns и выход

' а также наличие папки ...\Arhives

' сообщение, что не найдена папка \Arhives для хранения архивов и выход
idProg = Shell(strAppPath & "AddOns\WinRAR a -r -m5 -ag_DD-MM-YYYY_HH-MM " & _

strAppPath & "Arhives\MyDataBase_Data " & strAppPath & _

"MyDataBase_Data.mdb",vbHide)
bIsStarted = True
End Sub

Private Sub Form_Timer()
Dim IsRunning As Boolean
Dim hProc As Long, iRet As Long

If bIsStarted Then
' стартовали и ждем-с, когда закончится внешняя программа
hProc = OpenProcess(PROCESS_QUERY_INFORMATION, False, idProg)
If hProc <> vbNull Then GetExitCodeProcess hProc, iRet
IsRunning = (iRet = STILL_ACTIVE)
CloseHandle hProc

If Not IsRunning Then ' процесса больше нет - все закончилось

DoCmd.Close
End If
End If
End Sub

Других ссылок я не видел. Буду рад, если это поможет, в таком случае прошу прокомментировать, как все это работает!!!
27 ноя 06, 01:21    [3452992]     Ответить | Цитировать Сообщить модератору
 Re: Проверка активности процесса  [new]
Бенедикт
Member

Откуда:
Сообщений: 2099
gerra,
"но у меня затыкается на строчке Call OShell.Run" - исчерпывающее описание.
"неясно, что такое DoEvents" - есть чУдная кнопка F1.

Если надо запустить процесс, и дождаться его окончания, то один пример ты сам привёл: он запускается через Shell, на форме есть таймер, Form_Timer - обработчик события таймера проверяет, не закончился ли процесс, рисует анимацию.

Другой пример (замена Shell с ожиданием) здесь.
27 ноя 06, 13:30    [3455058]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить