![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пока выполняется процесс. [D7, WinXP]
Wood © (2004-12-29 04:41:00)С наступающим всех!
Помогите с таким вопросом:
Из моей программы вызывается сторонняя программа,
например, архиватор, т.е. программа, выполняющая
длительный процесс. Нужно, пока выполняется процесс,
что бы кнопка в моей проге, которая открыла стороннюю
программу, была временно не активна, пока не закончится
процесс. Каким образом это реализуется? Примерчик, плз.
или дельный совет.
Спасибо.
Wood (2005-01-04 07:36:00) [1]>Fay ©
Спасибо за ссылку
Fay (2005-01-04 07:09:00) [2]Но тов. Рихтера там нет 8)
Fay (2005-01-04 07:06:00) [3]http://www.podgoretsky.com/pascal.html
Wood (2005-01-04 04:39:00) [4]> GanibalLector © [15]
Причем тут на русском? Где ж его взять, Рихтера? Все, что я смог достать из печатной литеры по Delphi - это "Делфи для чайников"
GanibalLector (2005-01-03 19:11:00) [5]>Ведь хотелось бы не только тупо применить пример, но и понять ЧТО я делаю
Тогда открой Рихтера...там все на русском :)
Wood (2005-01-03 19:05:00) [6]GanibalLector ©[13]
Смотрел.
Учитывая, что я вообще в первый раз пытаюсь понять данную тему, считаю, что это "попытка". Ведь хотелось бы не только тупо применить пример, но и понять ЧТО я делаю.
GanibalLector (2005-01-03 17:41:00) [7]>Вторая попытка разобраться. Если не получится, придется с этим (приемом) завязать
Ты [6] смотрел???Какая еще попытка???
Wood (2005-01-03 17:38:00) [8]Спасибо за отзывчивость!
Вторая попытка разобраться. Если не получится, придется с этим (приемом) завязать
Fay (2005-01-03 17:21:00) [9]
> не это гарантируется.
В смысле "это не гарантируется". 8)
Fay (2005-01-03 17:20:00) [10]2 MBo © (03.01.05 15:40) [6]
В приведённом примере есть некая переменнаяcmdline:string;используемая какPChar(cmdline), // Command line..
Это не есть гуд, т.к. память по этому указателю должна быть доступна на запись, а в данном примере, IMHO, не это гарантируется.
kaZaNoVa (2005-01-03 16:43:00) [11]Erik1 © (03.01.05 15:59) [8]
а я всегда поток завожу - имхо проще и глюков не будет))
Erik1 (2005-01-03 15:59:00) [12]А я бы без дополнительного потока обошолся(может быть), MsgWaitForMultipleObjects(1, Handle, False, INFINITE, QS_ALLINPUT) поможет. Тлько надо незабыть обработать очередь сообщений.
TUser (2005-01-03 15:45:00) [13]
> я почти начинающий.
Т.е. почти уже начал программировать? Я бы сделал такой поток
type TMine = class(TThread)
private
FBool: boolean;
procedure Go;
public
procedure Execute; override;
end;
procedure TMine.Go;
begin
Form1.Button1.Enabled:=FBool;
end;
procedure TMine.Execute;
var pi: _Process_information;
si: _security_information;
begin
FBool:=false;
Synchronize(Go);
{Подготовить pi и si и передать из функции CreateProcess}
WaitForSingleObject(pi.hProcessID);
FBool:=true;
Synchronize(Go);
end;
MBo (2005-01-03 15:40:00) [14]http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988621841&n=15
Wood (2005-01-03 15:37:00) [15]Граждане! Помогите кто чем может!
Сами мы не местные... :)
Как начать и углубить от CreateProcess и далее? С чем это едят?
Wood (2005-01-03 14:48:00) [16]С Новым годом!
Ну, хорошо. Ни черта я не разобрался и не понял, т.к. с WinApi`шными функциями сталкивался крайне редко,я почти начинающий. Процесс (стороннюю программу) вызываю из ActionList (FileRun). Может быть, мне помог какой-нибудь пример.
>>snake_r[1]
Вы правы, как задал вопрос, так и ответили.
Но все же, это наверное очень серьезная тема? Был бы благодарен любой, более подробной помощи на эту тему.
Спасибо.
Wood (2004-12-29 16:57:00) [17]>>Digitman[2]
Спасибо. Может разберусь.
Digitman (2004-12-29 09:37:00) [18]
> вызывается сторонняя программа
читай - стартует процесс
каждый процесс имеет глобально уникальный ProcessId и локально уникальный ProcessHandle, которые ты получаешь в результате успешного вызова CreateProcess
ProcessHandle - хэндл открытого процесса - является объектом интерпроцессной синхронизации и допустим в кач-ве параметра в вызовах различных ф-ций синхронизации, таких как WaitForSingleObject[Ex], [Msg]WaitForMulipleObjects[Ex]
любая из этих ф-ций, получив соответствующим параметром этот ProcessHandle, будет "ждать" указанное тобой время факта завершения стартованного тобой процесса, при этом возврат ф-цией значения WAIT_OBJECT_0 как раз и констатирует этот факт .. кр.того, [Msg]WaitFor-ф-ции позволяют в период ожидания реагировать на факты наличия win-сообщений в очереди текущего (т.е. вызывающего эти ф-ции) кодового потока, что дает возможность не "замораживать" пользовательский интерфейс в период ожидания
по факту завершения процесса с целью освобождения занятых ресурсов следует закрыть хэндл ProcessHandle, а также ThreadHandle, полученный при вызове CreateProcess, вызовами CloseHandle()
snake_r (2004-12-29 09:16:00) [19]Button1.Enabled:=False;
а когда твой процесс завершится то
Button1.Enabled:=true;