Форум: "WinAPI";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];
Вниз"Остановить" приложение Найти похожие ветки
← →
sd_simf (2005-10-31 19:22) [0]Как остановить выполнение безоконного приложения(Not Exit;), которое по задумке должна "отморозить" функция? Есть вариант это установка значения глоб. переменной и проверка ее в цикле, но это как я понимаю -проц. время, есть еще вариант это зарегистрировать класс, и посылать сообщение фиктивному окну. Подскажите может есть вариант намного легче и я изобретаю велосипед?
← →
DiamondShark © (2005-10-31 23:55) [1]
> Есть вариант это установка значения глоб. переменной и проверка
> ее в цикле, но это как я понимаю -проц. время
Во-первых, процессорное время в цикле можно использовать для полезной работы.
А во-вторых, если делать совсем нечего, то можно использовать системные объекты синхронизации. В данном случае подойдёт именованное событие.
см.
CreateEvent
OpenEvent
SetEvent
WaitForSingleObject
← →
Ораклиный глаз (2005-11-01 00:39) [2]Sleep ?
← →
Polevi © (2005-11-01 08:33) [3]>Ораклиный глаз (01.11.05 00:39) [2]
нет
← →
Leonid Troyanovsky © (2005-11-01 15:50) [4]> Polevi © (01.11.05 08:33) [3]
> >Sleep ?
> нет
SleepEx.
--
Regards, LVT.
← →
sd_simf (2005-11-01 16:07) [5]спасибо. буду разбираться
← →
Digitman © (2005-11-01 16:52) [6]
> sd_simf (01.11.05 16:07) [5]
при Sleep[ex] код.поток приложения, вызвавший сабж, "замерзнет" на столько, на сколько указано параметром вызванной ф-ции.
← →
Набережных С. © (2005-11-01 16:56) [7]
> Leonid Troyanovsky © (01.11.05 15:50) [4]
> SleepEx.
А как здесь использовать SleepEx? Внедряться в этот процесс? Обмениваться адресом процедуры для APC? Не получится - из пушки по воробьям? Или я чего-то не того...:)) не понимаю или не знаю?
А кстати, сработает вызов QueueUserAPC для потока другого процесса?
← →
Baltika-29 (2005-11-01 17:09) [8]>sd_simf (31.10.05 19:22)
Есть простое решение.
В безоконном приложении создается очередь сообщений.
Приложение ждет, пока придет сообщение потоку от стороннейго приложения, после чего "просыпается".
Просто и немудрено в реализации.
← →
Игорь Шевченко © (2005-11-01 17:25) [9]
> Как остановить выполнение безоконного приложения(Not Exit;
> ), которое по задумке должна "отморозить" функция?
WaitForSingleObject с таймаутом не подойдет ?
И кстати, почему не Sleep ?
← →
Набережных С. © (2005-11-01 17:28) [10]
> Baltika-29 (01.11.05 17:09) [8]
> Просто и немудрено в реализации.
Только потребует предварительной между процессами значением Thread ID, в который будет посылаться сообщение. Имхо [1] - наилучший вариант. Вот если все-равно предполагается обмен данными между между процессами, то тогда и сообщения годятся, и другие способы, например MMF, а иначу никчему.
← →
Набережных С. © (2005-11-01 17:30) [11]
> Только потребует предварительной между процессами значением
> Thread ID,
В смысле:
Только потребует предварительного обмена между процессами значением Thread ID,
← →
Leonid Troyanovsky © (2005-11-01 17:40) [12]
> Набережных С. © (01.11.05 16:56) [7]
> > SleepEx.
> А как здесь использовать SleepEx? Внедряться в этот процесс?
Да, вроде, из исходной постановки можно заключить,
что останавливаемый поток - из самодельного процесса.
За это же - и рассуждения об окне в оном.
> Обмениваться адресом процедуры для APC? Не получится -
> из пушки по воробьям? Или я чего-то не того...:)) не понимаю
> или не знаю?
А чего такого? DuplicateHandle - и не надо мучительно думать,
как непротиворечиво именовать объекты.
Тем более, что, возможно, хендл достанется и без сверхусилий -
CreateProcess или по наследству.
> А кстати, сработает вызов QueueUserAPC для потока другого
> процесса?
Работает как часы.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2005-11-01 17:51) [13]
> Leonid Troyanovsky © (01.11.05 17:40) [12]
> > Обмениваться адресом процедуры для APC? Не получится
А..
Ну, адресом тоже можно обменятся (канал связи, все равно, не лишний).
На худой конец, для выхода SleepEx сгодится любая, скажем, из kernel32,
с приемлемым прототипом.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2005-11-01 17:56) [14]
> Leonid Troyanovsky © (01.11.05 17:51) [13]
> Ну, адресом тоже можно обменятся (канал связи, все равно,
Мне как-то потребовалось передать значение хендла
через семафор. Ничего - работало даже в 95.
--
Regards, LVT.
← →
Набережных С. © (2005-11-01 18:13) [15]
> Leonid Troyanovsky ©
> А чего такого?
Да в общем-то ничего:) Мне просто кажется, что это ...э...несколько чересчур в данном случае:)) Канал обмена может и не лишний, а может и нафиг не нужен, кто его знает, автор-то молчит.
> и не надо мучительно думать,
> как непротиворечиво именовать объекты.
GUID рулит:)
← →
Baltika-29 (2005-11-01 18:22) [16]В принципе, с очередью сообщений сложнее, нежели с именованным 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.
← →
Leonid Troyanovsky © (2005-11-01 18:29) [17]
> Набережных С. © (01.11.05 18:13) [15]
> > как непротиворечиво именовать объекты.
> GUID рулит:)
Когда речь заходит о зашивке имен в код, то я предпочту
немного помучиться, чем довериться к.л. генератору.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.01.08;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c