Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
8-1123179611
Logun
2005-08-04 22:20
2006.01.08
Управление Winamp-ом


14-1134568925
VirEx
2005-12-14 17:02
2006.01.08
FoxMail - run dialup


3-1131975971
alsov
2005-11-14 16:46
2006.01.08
Ошибка вывода большого числа


10-1111148607
va
2005-03-18 15:23
2006.01.08
Регистрация СОМ-сервера


2-1135087626
Лиза
2005-12-20 17:07
2006.01.08
TreeVIew SOOS!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский