![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"Остановить" приложение [D7, Win2k]
sd_simf © (2005-10-31 19:22:00)Как остановить выполнение безоконного приложения(Not Exit;), которое по задумке должна "отморозить" функция? Есть вариант это установка значения глоб. переменной и проверка ее в цикле, но это как я понимаю -проц. время, есть еще вариант это зарегистрировать класс, и посылать сообщение фиктивному окну. Подскажите может есть вариант намного легче и я изобретаю велосипед?
Leonid Troyanovsky (2005-11-01 18:29:00) [1]
> Набережных С. © (01.11.05 18:13) [15]
> > как непротиворечиво именовать объекты.
> GUID рулит:)
Когда речь заходит о зашивке имен в код, то я предпочту
немного помучиться, чем довериться к.л. генератору.
--
Regards, LVT.
Baltika-29 (2005-11-01 18:22:00) [2]В принципе, с очередью сообщений сложнее, нежели с именованным Event.
С этим объектом получается достаточно просто:
//Ожидающее события приложение.
program Project1;
{$AppType console}
uses
windows,
SysUtils;
var
Evt: THandle;
NameEvt: PChar='{FDE1D954-8582-4C18-90A4-165480E8BC3B}';
function SetEvt: Boolean;
begin
Evt := CreateEvent(nil,True,False,NameEvt);
Result := (Evt <> 0) and (GetLastError <> ERROR_ALREADY_EXISTS);
end;
function WaitEvt: Boolean;
begin
Result := (WaitForSingleObject(Evt, INFINITE) = WAIT_OBJECT_0);
ResetEvent(Evt);
end;
begin
if (not SetEvt) then
begin
WriteLn('Error1');
Exit;
end;
while True do
begin
if (not WaitEvt) then
begin
WriteLn('Error2');
Exit;
end;
WriteLn('Event signalled');
end;
end.
//Пробуждающее приложение.
program Project2;
{$APPTYPE CONSOLE}
uses
windows,
SysUtils;
var
Evt: THandle;
NameEvt: PChar='{FDE1D954-8582-4C18-90A4-165480E8BC3B}';
function OpenEvt: Boolean;
begin
Evt := OpenEvent(EVENT_ALL_ACCESS, False,NameEvt);
Result := (Evt <> 0);
end;
begin
if (not OpenEvt) then
begin
WriteLn('Error1');
Exit;
end;
SetEvent(Evt);
end.
Набережных С. (2005-11-01 18:13:00) [3]
> Leonid Troyanovsky ©
> А чего такого?
Да в общем-то ничего:) Мне просто кажется, что это ...э...несколько чересчур в данном случае:)) Канал обмена может и не лишний, а может и нафиг не нужен, кто его знает, автор-то молчит.
> и не надо мучительно думать,
> как непротиворечиво именовать объекты.
GUID рулит:)
Leonid Troyanovsky (2005-11-01 17:56:00) [4]
> Leonid Troyanovsky © (01.11.05 17:51) [13]
> Ну, адресом тоже можно обменятся (канал связи, все равно,
Мне как-то потребовалось передать значение хендла
через семафор. Ничего - работало даже в 95.
--
Regards, LVT.
Leonid Troyanovsky (2005-11-01 17:51:00) [5]
> Leonid Troyanovsky © (01.11.05 17:40) [12]
> > Обмениваться адресом процедуры для APC? Не получится
А..
Ну, адресом тоже можно обменятся (канал связи, все равно, не лишний).
На худой конец, для выхода SleepEx сгодится любая, скажем, из kernel32,
с приемлемым прототипом.
--
Regards, LVT.
Leonid Troyanovsky (2005-11-01 17:40:00) [6]
> Набережных С. © (01.11.05 16:56) [7]
> > SleepEx.
> А как здесь использовать SleepEx? Внедряться в этот процесс?
Да, вроде, из исходной постановки можно заключить,
что останавливаемый поток - из самодельного процесса.
За это же - и рассуждения об окне в оном.
> Обмениваться адресом процедуры для APC? Не получится -
> из пушки по воробьям? Или я чего-то не того...:)) не понимаю
> или не знаю?
А чего такого? DuplicateHandle - и не надо мучительно думать,
как непротиворечиво именовать объекты.
Тем более, что, возможно, хендл достанется и без сверхусилий -
CreateProcess или по наследству.
> А кстати, сработает вызов QueueUserAPC для потока другого
> процесса?
Работает как часы.
--
Regards, LVT.
Набережных С. (2005-11-01 17:30:00) [7]
> Только потребует предварительной между процессами значением
> Thread ID,
В смысле:
Только потребует предварительного обмена между процессами значением Thread ID,
Набережных С. (2005-11-01 17:28:00) [8]
> Baltika-29 (01.11.05 17:09) [8]
> Просто и немудрено в реализации.
Только потребует предварительной между процессами значением Thread ID, в который будет посылаться сообщение. Имхо [1] - наилучший вариант. Вот если все-равно предполагается обмен данными между между процессами, то тогда и сообщения годятся, и другие способы, например MMF, а иначу никчему.
Игорь Шевченко (2005-11-01 17:25:00) [9]
> Как остановить выполнение безоконного приложения(Not Exit;
> ), которое по задумке должна "отморозить" функция?
WaitForSingleObject с таймаутом не подойдет ?
И кстати, почему не Sleep ?
Baltika-29 (2005-11-01 17:09:00) [10]>sd_simf (31.10.05 19:22)
Есть простое решение.
В безоконном приложении создается очередь сообщений.
Приложение ждет, пока придет сообщение потоку от стороннейго приложения, после чего "просыпается".
Просто и немудрено в реализации.
Набережных С. (2005-11-01 16:56:00) [11]
> Leonid Troyanovsky © (01.11.05 15:50) [4]
> SleepEx.
А как здесь использовать SleepEx? Внедряться в этот процесс? Обмениваться адресом процедуры для APC? Не получится - из пушки по воробьям? Или я чего-то не того...:)) не понимаю или не знаю?
А кстати, сработает вызов QueueUserAPC для потока другого процесса?
Digitman (2005-11-01 16:52:00) [12]
> sd_simf (01.11.05 16:07) [5]
при Sleep[ex] код.поток приложения, вызвавший сабж, "замерзнет" на столько, на сколько указано параметром вызванной ф-ции.
sd_simf (2005-11-01 16:07:00) [13]спасибо. буду разбираться
Leonid Troyanovsky (2005-11-01 15:50:00) [14]> Polevi © (01.11.05 08:33) [3]
> >Sleep ?
> нет
SleepEx.
--
Regards, LVT.
Polevi (2005-11-01 08:33:00) [15]>Ораклиный глаз (01.11.05 00:39) [2]
нет
Ораклиный глаз (2005-11-01 00:39:00) [16]Sleep ?
DiamondShark (2005-10-31 23:55:00) [17]
> Есть вариант это установка значения глоб. переменной и проверка
> ее в цикле, но это как я понимаю -проц. время
Во-первых, процессорное время в цикле можно использовать для полезной работы.
А во-вторых, если делать совсем нечего, то можно использовать системные объекты синхронизации. В данном случае подойдёт именованное событие.
см.
CreateEvent
OpenEvent
SetEvent
WaitForSingleObject