Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.12;
Скачать: CL | DM;

Вниз

Слишком быстрый переход на выполнение след оперетора...   Найти похожие ветки 

 
programmer90   (2008-09-03 10:40) [0]

Здравствуйте.
Проблема такова:
 {1}Memo[AdvPageControl1.ActivePageIndex].Lines.SaveToFile("d:\file.pas");
 {2}ShellExecute(Handle,"open","cmd","/c  c:\fpc\2.2.0\bin\i386-win32\fpc d:\file.pas >d:\file.err   && cls && d:\file.exe && pause",nil,1);
{3]Sleep(1000);
{4]MessagesBox.Items.LoadFromFile("d:\file.err");

В общем проблема такова: переход со второго оператора на четвертый происходит очень быстро и он не успевает доконца выполнить {2}, о чем свидетельствует ошибка файл d:\file.err занят другим процессом...
Как можно проконтролировать полное выполнение 2-ой строчки(в основном помоему запись в файл происходит медленно),и избавиться от Sleep-a раз и навсегда?
Cпс.


 
DrPass ©   (2008-09-03 10:44) [1]

ShellExecuteEx вернет тебе хендл запущенного процесса, а WaitForSingleObject позволит дождаться, пока этот процесс завершится


 
Сергей М. ©   (2008-09-03 10:46) [2]

Использовать ShellExecuteEx или CreateProcess + использовать любую подходящую ф-цию ожидания, например, WaitForSingleObject


 
programmer90   (2008-09-03 10:47) [3]

А можно поподробнее?
WaitForSingleObject-я много СЛЫШАЛ о этом но ни разу не применял, можно вкратце для чего и как он работает?


 
DrPass ©   (2008-09-03 10:51) [4]


> WaitForSingleObject-я много СЛЫШАЛ о этом но ни разу не
> применял, можно вкратце для чего и как он работает?

Принимает на вход дескриптор какого-либо объекта системы, и ждет до тех пор, пока он не перейдет в сигнальное состояние. Сигнальное состояние у разных типов объектов разное. Например, у процесса - когда он завершен.


 
Плохиш ©   (2008-09-03 10:53) [5]


> programmer90   (03.09.08 10:47) [3]
> А можно поподробнее?

Конечно, www.yahoo.com - подробней некуда...


 
programmer90   (2008-09-03 10:53) [6]


> Принимает на вход дескриптор какого-либо объекта системы,
>  и ждет до тех пор, пока он не перейдет в сигнальное состояние.
>  Сигнальное состояние у разных типов объектов разное. Например,
>  у процесса - когда он завершен.

Ну теперь суть понятна, если есть материал пжлст укажите ссылочку.


 
Сергей М. ©   (2008-09-03 10:54) [7]

WaitForSingleObject принимает одним из параметров хэндл объекта, способного "сигналить" о некоем своем событии. Пока это событие не произошло (или не был превышен указанный другим параметром таймаут ожидания этого сигнального события), ф-ция WaitForSingleObject не вернет управление.

Таким объектом является в т.ч. объект-процесс, который создается в рез-те вызова любой из вышефигурировавших функций. Но ShellExecute не возвращает хэндл созданного объекта-процесса, в то время как две другие альтернативные ф-ции его возвращают, что дает возможность использовать этот хендл в Wait-функции.


 
programmer90   (2008-09-03 10:58) [8]


> WaitForSingleObject принимает одним из параметров хэндл
> объекта, способного "сигналить" о некоем своем событии.
> Пока это событие не произошло (или не был превышен указанный
> другим параметром таймаут ожидания этого сигнального события),
>  ф-ция WaitForSingleObject не вернет управление.Таким объектом
> является в т.ч. объект-процесс, который создается в рез-
> те вызова любой из вышефигурировавших функций. Но ShellExecute
> не возвращает хэндл созданного объекта-процесса, в то время
> как две другие альтернативные ф-ции его возвращают, что
> дает возможность использовать этот хендл в Wait-функции.
>

Дело за малым...
Осталось закодить всё это.


 
Сергей М. ©   (2008-09-03 11:01) [9]


> Осталось закодить всё это


за чем же дело стало ? Флаг в руки и - вперед !)


 
brother ©   (2008-09-03 11:03) [10]

> Флаг в руки и - вперед !)

а барабан на шею?))))))))


 
Ega23 ©   (2008-09-03 11:19) [11]


function RunAndWait (const ExeName, ParamString: string;
 QuoteParams: Boolean = true): Integer;
// (c) by Игорь Шевченко
var
 ShellInfo: TShellExecuteInfo;
 ExitCode: DWORD;
begin
 ShellInfo.cbSize := SizeOf(ShellInfo);
 ShellInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
 ShellInfo.Wnd := HWND_DESKTOP;
 ShellInfo.lpVerb := "open";
 ShellInfo.lpFile := PChar(ExeName);
 if QuoteParams then
   ShellInfo.lpParameters := PChar("""+ParamString+""")
 else
   ShellInfo.lpParameters := PChar(ParamString);
 ShellInfo.lpDirectory := PChar(ExtractFilePath(ExeName));
 ShellInfo.nShow := SW_HIDE;
 if not ShellExecuteEx(@ShellInfo) then
   RaiseLastOSError;
 if ShellInfo.hProcess <> 0 then
   try
     WaitForSingleObjectEx(ShellInfo.hProcess, INFINITE, false);
     GetExitCodeProcess(ShellInfo.hProcess, ExitCode);
     Result := ExitCode;
   finally
     CloseHandle(ShellInfo.hProcess);
   end
 else
   Result := -1;
end;



Страницы: 1 вся ветка

Текущий архив: 2008.10.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
2-1220887663
Terasbetoni
2008-09-08 19:27
2008.10.12
Использование двух классов друг другом. Классы в разных модулях


2-1220347492
DerMeister
2008-09-02 13:24
2008.10.12
SQL query


3-1207907676
Xmen
2008-04-11 13:54
2008.10.12
Проблемы с DBGridом


2-1220874482
aaandy21
2008-09-08 15:48
2008.10.12
как связать написанную на Delphi DLL c VC?


2-1220248002
Abcdef123
2008-09-01 09:46
2008.10.12
Работа в среде Дельфи 2007.Что значат ошибки в окне Structure?