AProcess.Options + [poWaitOnExit]

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

AProcess.Options + [poWaitOnExit]

Сообщение vitaly_l »

AProcess.Options := AProcess.Options + [poWaitOnExit];
Запускает внешнюю программу и ждёт её выполнения, при этом запускающая программа "типа висит"...
Если убрать poWaitOnExit, то запускаемая программа - не всегда выполняется правильно...

Нужна золотая середина...

:?: Вопрос: Как сделать чтобы можно было запускать внешнюю программу.., получать уведомление о её выполнении,
но при этом, чтобы запускающая программа - не "висела", а её можно было например перемещать по экрану?
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

У Tprocess есть свойство running

Есть еще вариант, создавать файл и перед стартом удалять, затем без poWaitOnExit

Код: Выделить всё

while ((FileExists(GetCurrentDir + '\tools\Charset\result_charset.txt')=false) or (E9FileStatus(GetCurrentDir + '\tools\Charset\result_charset.txt')=false)) do sleep (20);


Код: Выделить всё

function E9FileStatus(const Origin: string): boolean;
var
  F: TFileStream;
begin
  //используется ли файл в данный момент другим приложением
{
    Значение             Описание
    fmCreate             Созда¸т файл с данным именем. Если файл существует, то открыть его в
                                 режиме записи.
    fmOpenRead           Открыть файл только для чтения.
    fmOpenWrite          Открыть файл только на запись. При этом запись в файл заменит вс¸ его
                                 содержимое.
    fmOpenReadWrite Открыть файл скорее для изменения содержимого чем для замены его.

    Режим доступа должен иметь одно из следующих значений:

    Значение            Описание
    fmShareCompat       Доступ к файлу совместим с FCB.
    fmShareExclusive    Другое приложение не может открыть файл для различных целей.
    fmShareDenyWrite    Другое приложение может открыть файл для чтения, но не для записи.
    fmShareDenyRead     Другое приложение может открыть файл для записи, но не для чтения.
    fmShareDenyNone     Разрешить другим файлам делать с файлом и чтени и запись.

    Если файл невозможно открыть, то Create сгенерирует исключение.
    Возвращает true если файл не заблокирован
}
  try
    F := TFileStream.Create(Origin, fmOpenReadWrite or fmShareExclusive);
    try
      Result := true;
    finally
      F.Free;
    end;
  except
    Result := false;
  end;
end;                                           


http://code.google.com/p/price-vampire/ ... rmmain.pas
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Ism писал(а):E9FileStatus

Спасибо: идея ясна и понятна(пригодится).
Но суть вопроса в другом, У меня нет проблемы с выяснением окончания процесса, проблема в другом.
Ism писал(а):У Tprocess есть свойство running

Вот такой код позволяет перемещать "форму" во время выполнения:
while AProcess.Running do Application.ProcessMessages;
Однако кнопка (крестик), которая должна сделать Close, не работает...

Что не так???
Как оборвать процесс???

.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Смотрим в сторону много поточности, а конкретно класс TThread.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

while AProcess.Running do Application.ProcessMessages;


Можно проще, бросить Ttimer на форму и Ontimer делать Application.ProcessMessages , тогда события элементов должны работать
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Ism писал(а):тогда события элементов должны работать

Таймер "крутится" в основном цикле, т.ч. вы даже события от таймера не получите.
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Если стартануть без poWaitOnExit, то код программы нормально будет выполняться , будто ничего не произошло.Будут работать и события таймера и остальные.

Или я ошибаюсь ?
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Ism писал(а):Если стартануть без poWaitOnExit, то код программы нормально будет выполняться

Я и так стартую без poWaitOnExit...

function "on FormMouseDown" do Halt; - работает при нажатии на форму...
А Click на крестик - нет... Click на "Крестик" - отключился... Как оживить Click на "крестик"???...
У крестика наверно тоже есть событие onКрестик.Click do ...
:?: Вопрос: Как называется событие onКрестик.Click ???



.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Ism писал(а):Или я ошибаюсь ?

Не ошибаетесь.
vitaly_l
TForm.OnClose, TForm.OnCloseQuery.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Mr.Smart писал(а):TForm.OnClose, TForm.OnCloseQuery.

Нет - это события, которые вызываются, после...
А как сам msg называется??? (я думаю: это баг, т.к. всё остальное работает, где-то забыли прописать код, поэтому и не работает)...

Добавлено спустя 9 минут 23 секунды:
Вообще все кнопки работают кроме крестика... Можно даже FileOpen сделать...
Очевидно при старте Tprocess - отключается крестик... Почему?? Зачем???

Добавлено спустя 7 минут 19 секунд:
А потом (после окончания Tprocess) - снова работает...
Это: либо специально задумано, либо баг...
как сам msg нажатия на крестик называется???
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

А зачем вам закрывать программу до окончания процесса ? Так что все правильно.
Либо сделайте отдельную кнопку для закрытия
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Это не правильно... Там процесс долгий... и я например хочу прервать...
всё работает, а крестик нет... Я просто не умею отлавливать события... художник...
как сам msg нажатия на крестик называется??? Как его отловить??? Сама кнопка нажимается... только результата нет...
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

WM_CLOSE
Ism
энтузиаст
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Сообщение Ism »

Павтаряю

Либо сделайте отдельную кнопку для закрытия
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

Ism писал(а):Либо сделайте отдельную кнопку для закрытия

Отдельную кнопку это плохо... должен работать "крестик"...
Если кто знает вариант, оживления "крестика", то пишите...

.
Ответить