![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Слишком быстрый переход на выполнение след оперетора... [XP]
programmer90 © (2008-09-03 10:40:00)Здравствуйте.
Проблема такова:
{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пс.
Ega23 (2008-09-03 11:19:00) [1]
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;
brother (2008-09-03 11:03:00) [2]> Флаг в руки и - вперед !)
а барабан на шею?))))))))
Сергей М. (2008-09-03 11:01:00) [3]
> Осталось закодить всё это
за чем же дело стало ? Флаг в руки и - вперед !)
programmer90 (2008-09-03 10:58:00) [4]
> WaitForSingleObject принимает одним из параметров хэндл
> объекта, способного "сигналить" о некоем своем событии.
> Пока это событие не произошло (или не был превышен указанный
> другим параметром таймаут ожидания этого сигнального события),
> ф-ция WaitForSingleObject не вернет управление.Таким объектом
> является в т.ч. объект-процесс, который создается в рез-
> те вызова любой из вышефигурировавших функций. Но ShellExecute
> не возвращает хэндл созданного объекта-процесса, в то время
> как две другие альтернативные ф-ции его возвращают, что
> дает возможность использовать этот хендл в Wait-функции.
>
Дело за малым...
Осталось закодить всё это.
Сергей М. (2008-09-03 10:54:00) [5]WaitForSingleObject принимает одним из параметров хэндл объекта, способного "сигналить" о некоем своем событии. Пока это событие не произошло (или не был превышен указанный другим параметром таймаут ожидания этого сигнального события), ф-ция WaitForSingleObject не вернет управление.
Таким объектом является в т.ч. объект-процесс, который создается в рез-те вызова любой из вышефигурировавших функций. Но ShellExecute не возвращает хэндл созданного объекта-процесса, в то время как две другие альтернативные ф-ции его возвращают, что дает возможность использовать этот хендл в Wait-функции.
Плохиш (2008-09-03 10:53:00) [6]
> programmer90 (03.09.08 10:47) [3]
> А можно поподробнее?
Конечно, www.yahoo.com - подробней некуда...
programmer90 (2008-09-03 10:53:00) [7]
> Принимает на вход дескриптор какого-либо объекта системы,
> и ждет до тех пор, пока он не перейдет в сигнальное состояние.
> Сигнальное состояние у разных типов объектов разное. Например,
> у процесса - когда он завершен.
Ну теперь суть понятна, если есть материал пжлст укажите ссылочку.
DrPass (2008-09-03 10:51:00) [8]
> WaitForSingleObject-я много СЛЫШАЛ о этом но ни разу не
> применял, можно вкратце для чего и как он работает?
Принимает на вход дескриптор какого-либо объекта системы, и ждет до тех пор, пока он не перейдет в сигнальное состояние. Сигнальное состояние у разных типов объектов разное. Например, у процесса - когда он завершен.
programmer90 (2008-09-03 10:47:00) [9]А можно поподробнее?
WaitForSingleObject-я много СЛЫШАЛ о этом но ни разу не применял, можно вкратце для чего и как он работает?
Сергей М. (2008-09-03 10:46:00) [10]Использовать ShellExecuteEx или CreateProcess + использовать любую подходящую ф-цию ожидания, например, WaitForSingleObject
DrPass (2008-09-03 10:44:00) [11]ShellExecuteEx вернет тебе хендл запущенного процесса, а WaitForSingleObject позволит дождаться, пока этот процесс завершится