Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.08;
Скачать: CL | DM;

Вниз

"Остановить" приложение   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2006.01.08;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
1-1133964987
MetalFan
2005-12-07 17:16
2006.01.08
функция, обратная format


14-1134403412
Igorek
2005-12-12 19:03
2006.01.08
А у Вас в стране политики проводят Интернет чаты?


14-1134644004
Pazitron_Brain
2005-12-15 13:53
2006.01.08
Я


14-1134384980
Piter
2005-12-12 13:56
2006.01.08
Управление клиентом p2p сети Direct Connect (DC), UKC, DC++


9-1122297205
Warchief
2005-07-25 17:13
2006.01.08
Поиск пути для "многоклеточных объектов"