Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Есть ли режим "ожидания"?

248
17 октября 2007 года
Dmitry2064
590 / / 06.12.2006
Такая задачка. Я копирую большую директорию в такую же, но с номером большим на единицу. (пока я это делаю руками). А потом макросом вычищаю ее содержимое (как тут и подсказали) - удаляю некторые старые файлы по маске (jpg, bmp, doc). Вот хотелось бы макрос по "очистке" полученной директории начать с ее первоначального копирования из прошлой. Но само копирование в новую директорию занимает секунд 30. Вот можно ли как-то "сказать" макросу, что подожди, пока докопируется, а потом уже начни оттуда удалять лишнее?

Спасибо.
405
18 октября 2007 года
Dmitrii
554 / / 16.12.2004
Вот пример:
Код:
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal processHandle As Long, _
    ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal desiredAccess As Long, _
    ByVal inheritHandle As Long, ByVal processId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal processHandle As Long) As Long

Sub Example()
Dim taskId As Long
Dim stopFlag As Long
Dim procHandle As Long
Const SYNCHRONIZE = &H100000
Const INFINITE = &HFFFF
taskId = Shell("calc.exe", vbNormalFocus)
procHandle = OpenProcess(SYNCHRONIZE, True, taskId)
stopFlag = WaitForSingleObject(procHandle, INFINITE)
If stopFlag <> -1 Then
    CloseHandle procHandle
    MsgBox "Процесс завершён."
End If
End Sub
248
18 октября 2007 года
Dmitry2064
590 / / 06.12.2006
Наверное, пока проще руками скопировать папку, а потом уже чистить. Потому что не смогу разобраться, куда здесь вставлять мои процедурки.

Спасибо.
405
18 октября 2007 года
Dmitrii
554 / / 16.12.2004
Цитата: Dmitry2064
... не смогу разобраться, куда здесь вставлять мои процедурки.


В примере синхронизируется работа макроса и работа процесса, запущенного с помощью функции [color=blue]Shell()[/color].
Алгоритм прост:
- запускается макрос;
- в процессе своей работы макрос инициирует запуск калькулятора
[color=blue]taskId = Shell("calc.exe", vbNormalFocus)[/color]
- после запуска калькулятора работа макроса приостанавливается до момента завершения работы калькулятора
[color=blue]procHandle = OpenProcess(SYNCHRONIZE, True, taskId)
stopFlag = WaitForSingleObject(procHandle, INFINITE)[/color]
- после завершения работы калькулятора работа макроса возобновляется.

Или Вам нужно было что-то другое?

248
18 октября 2007 года
Dmitry2064
590 / / 06.12.2006
Цитата: Dmitrii
...
Или Вам нужно было что-то другое?


Наверное, как раз это. Т.е. вместо запуска калькулятора мне надо запустить процедуру копирования...
Попробую.
Так. У меня процедура копирования сидит в Sub и я ее дожен вызвать Call MyFoldCopy()
Но при написании строки
TaskID = Call MyFoldCopy()
пишется, что неверный синтаксис. Т.е. можно ли вызову процедуры присваивать какой-то ID?

248
18 октября 2007 года
Dmitry2064
590 / / 06.12.2006
А может быть можно DoEvents использовать?
Или просто ничего не писать, а код сам дождется, когда одна его часть выполнится и перейдет к след. инструкции? Может так быть?
31K
19 октября 2007 года
kdss
9 / / 08.10.2007
У меня есть программа, которая ждет пока другая сформирует в текущем каталоге файл результатов. Делаю так:

Do
DoEvents
Loop While Dir(CurDir & "\solution.txt") = ""
405
19 октября 2007 года
Dmitrii
554 / / 16.12.2004
Цитата: Dmitry2064
... Или просто ничего не писать, а код сам дождется, когда одна его часть выполнится и перейдет к след. инструкции? Может так быть?


Dmitry2064, если у Вас просто два макроса, один из которых вызывает другой, то будет именно так.

 
Код:
Sub Ex1()
'...
Call Ex2
'вызов DoEvents НЕ НУЖЕН
'...
End Sub

Sub Ex2()
'...
End Sub

Приведённый же мной пример годится лишь в том случае, когда макрос запускает некий процесс через Shell(), т.к. по умолчанию такой процесс относительно макроса будет выполняться в асинхронном режиме.
248
20 октября 2007 года
Dmitry2064
590 / / 06.12.2006
Понял. У меня как раз ситуация "синхронная". Т.е. один макрос начнет выполняться только после оконачния работы предыдущего. Т.е. мне пока о синхронизации волноваться не нужно. Спасибо за разъяснения. А вообще про DoEvents и предложенные методы синхронизации буду иметь в виду.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог