Текущий архив: 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