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

Вниз

Обработка сообщений в TService + TDataModule   Найти похожие ветки 

 
malefik   (2007-07-11 10:23) [0]

HI . Если на форму сервиса бросить таймер.....и в обработчике его написать


void __fastcall TSRVDozor::Timer1Timer(TObject *Sender)
{
PostThreadMessage(SRVDozor->_id_thread,WM_CLIENT_LOG,3,5);
}


а в методе


void __fastcall TSRVDozor::ServiceExecute(TService *Sender)
{
 _start_srv();
 _id_thread = GetCurrentThreadId();
 MSG msg;
 while (!Terminated)
{
  if (WaitMessage())
   {
       Sleep(5);
       if(PeekMessage(&msg, NULL , WM_CLIENT_LOG, WM_CLIENT_LOG, PM_NOREMOVE) != 0)
       {
               _log_data_module->_write_to_log(msg.message,"asd",1,1);
       }
   ServiceThread->ProcessRequests(false);
   }
 }
}


НО ПРИ ДОБАВЛЕНИИ ДАТАМОДУЛЯ и отправки оттуда брошеным там таймером


void __fastcall T_log_data_module::_log_timerTimer(TObject *Sender)
{
PostThreadMessage(SRVDozor->_id_thread,WM_CLIENT_LOG,3,5);
}


работать не хочет .......ХОТЯ САМО СООБЩЕНИЕ ТАЙМЕРА ОТРАБАТЫВАЕТ.....ПРОВЕРЕНО установкой ДЕБУГА....


 
Сергей М. ©   (2007-07-11 10:44) [1]


> работать не хочет


А ты спроси у функции PostThreadMessage(), почему она "не хочет"..


 
Reindeer Moss Eater ©   (2007-07-11 10:44) [2]

PostThreadMessage - это функция.
И еще есть гетластеррор на случай если функция вернет false


 
Сергей М. ©   (2007-07-11 11:17) [3]


> Если на форму сервиса бросить таймер


Форма нужна сервису как корове седло.


 
malefik   (2007-07-11 12:21) [4]


> Форма нужна сервису как корове седло.


ну не так выразился ....design time формочка ....


> А ты спроси у функции PostThreadMessage(), почему она "не
> хочет"..


возвращает 1..


 
app ©   (2007-07-11 12:21) [5]

> malefik  (11.07.2007 10:23:00)  [0]

Си обсуждают в конференции Прочее, здесь только Дельфи


 
malefik   (2007-07-11 12:24) [6]

прошу прощения тут кашно си.......но я не спрашиваю как писать на си...такая же проблема может возникнуть и у дельфишного программера....т.к. от VCL никуда не дется......и WINAPI у всех одно


 
Reindeer Moss Eater ©   (2007-07-11 12:24) [7]

возвращает 1..

Осталось понять что это значит.

BOOL PostThreadMessage(          DWORD idThread,
   UINT Msg,
   WPARAM wParam,
   LPARAM lParam
);


 
Сергей М. ©   (2007-07-11 12:28) [8]


> design time формочка


Чего "design time" ?

Зачем вообще нужна форма при разработке проекта сервиса и в ходе исполнения приложения-сервиса ?


> возвращает 1


Значит сообщение успешно отправлено.

Лови его там, куда ты его послал)


 
malefik   (2007-07-11 12:36) [9]


> Осталось понять что это значит.
>
> BOOL PostThreadMessage(          DWORD idThread,
>    UINT Msg,
>    WPARAM wParam,
>    LPARAM lParam
> );
>


Я читал ниже....

Return Values
If the function succeeds, the return value is nonzero.

поэтому написал 1  ...


>
> Чего "design time" ?
>
> Зачем вообще нужна форма при разработке проекта сервиса
> и в ходе исполнения приложения-сервиса ?


Ну есть ведь форма.....для разрабоки и накидывания невизуальных компонент...
Ведь Tservice унаследован от TDataModule

Послал вроде правильно....т.к. если таймер лежит на Tservice тогда PostThreadMessage работает


 
Reindeer Moss Eater ©   (2007-07-11 12:38) [10]

поэтому написал 1  ...

Да не в этом дело. Если сообщение послано успешно, то какой вариант остается?


 
malefik   (2007-07-11 12:45) [11]


>
> Да не в этом дело. Если сообщение послано успешно, то какой
> вариант остается?


Да какая разница что придиратся то?.......NONZERO == TRUE


 
Сергей М. ©   (2007-07-11 12:47) [12]


> Ну есть ведь форма


Так я поэтому и задал тебе вопрос - зачем она тебе нужна ?


> для разрабоки и накидывания невизуальных компонент...
> Ведь Tservice унаследован от TDataModule


Вот прямо на этот DataModule и "накидывай", если ты по-иному не умеешь создавать комплоненты.


 
malefik   (2007-07-11 12:50) [13]


> Вот прямо на этот DataModule и "накидывай", если ты по-иному
> не умеешь создавать комплоненты.


Мдя все перерасло во флуд....
_log_datamodule = new T_log_datamodule(this);

блин речь то не о том а...


 
Сергей М. ©   (2007-07-11 12:58) [14]

Ну и накой ляд тебе еще один дейтамодуль ? Одного мало что ли ?

Уж не знаю я, что такое SRVDozor->_id_thread, но в Делфи доступ к ид-ру потока сервиса при заведомо известной и корректной ссылке на дейтамодуль сервиса осуществляется так:

MyServiceObject.ServiceThread.ThreadId


 
malefik   (2007-07-11 13:05) [15]


>
> Уж не знаю я, что такое SRVDozor->_id_thread,



void __fastcall TSRVDozor::ServiceExecute(TService *Sender)
{
_start_srv();
_id_thread = GetCurrentThreadId();


> MyServiceObject.ServiceThread.ThreadId


пробовал

SRVDozor->ServiceThread->ThreadID


 
Reindeer Moss Eater ©   (2007-07-11 13:05) [16]

Да какая разница что придиратся то?.......NONZERO == TRUE

Мальчик, к тебе никто не придирается.
Я знаю что такое 1 в си.


 
malefik   (2007-07-11 13:07) [17]


> Мальчик, к тебе никто не придирается.
> Я знаю что такое 1 в си.
>


Поздравляю...!!!


 
malefik   (2007-07-11 13:08) [18]

МАЛЬЧИК


 
Сергей М. ©   (2007-07-11 13:11) [19]


> _id_thread = GetCurrentThreadId();


А зачем это надо, если  _id_thread нигде более в теле ServiceExecute не используется ? И чем не угодил ServiceThread -> ThreadId ?


 
malefik   (2007-07-11 13:14) [20]


> А зачем это надо, если  _id_thread нигде более в теле ServiceExecute
> не используется ? И чем не угодил ServiceThread -> ThreadId
> ?

Честно сказать я уже все перепробовал.......обсуждение на RSDN есть ......зашло в тупик........сам сижу ничего не понимаю.....все должно работать.......НО НИКАК!


 
Сергей М. ©   (2007-07-11 13:25) [21]


> malefik   (11.07.07 13:14) [20]


Отладчик-то на что дан ?

Непосредственно перед PostThreadMessage() сравни значения SRVDozor->_id_thread и SRVDozor -> ServiceThread -> ThreadId.

Чудес-то не бывает)
Если PostThreadMessage() успешно отправила сообщение, и при этом предполагаемый поток-адресат его не получил, то это означает только одно - сообщение отправлено черт те какому потоку, но только не предполагаемому)


 
malefik   (2007-07-11 13:31) [22]

Одинаково ....


 
malefik   (2007-07-11 13:32) [23]

Отсюда вопрос.......какому потоку он мог отправить из второго датамодуля......если в самом теле сервиса нормально приходят


 
Reindeer Moss Eater ©   (2007-07-11 13:35) [24]

какому потоку он мог отправить

Какому просили отправить, такому и отправил.
Или ты думаешь там маленький живой думающий за тебя почтальон живет?
Который решает кому заслать мессадж.
:)


 
Сергей М. ©   (2007-07-11 13:39) [25]


> malefik


А в какой момент времени у тебя создается этот самый log_data_module ?


 
malefik   (2007-07-11 13:39) [26]


>
> Какому просили отправить, такому и отправил.
> Или ты думаешь там маленький живой думающий за тебя почтальон
> живет?
> Который решает кому заслать мессадж.
> :)


Можно без дурачества? По делу бы по делу....
Я ничего не думаю ......сам это использовал и не раз......но тут в ступор вошел этот датамодуль ......ни в какую....ведь threadid одинаков.....просто в разных местах вызывается ....чуствую я гдето глубже собака зарыта


 
malefik   (2007-07-11 13:40) [27]


> А в какой момент времени у тебя создается этот самый log_data_module
> ?
>

 создавался вначале автокреэйтом ......потом в ....


void __fastcall TSRVDozor::ServiceExecute(TService* Sender)
{
_start_srv();
MSG msg;
_log_datamodule = new T_log_datamodule(this);
       _log_datamodule->_id_thread = GetCurrentThreadId();
while (!Terminated)
{
 if (WaitMessage())
 {
         Sleep(5);
  if (PeekMessage(&msg, NULL, WM_CLIENT_LOG, WM_CLIENT_LOG, PM_NOREMOVE) != 0)
  {
   _log_datamodule->_write_to_log(msg.message, "asd", 1, 1);
  }
  ServiceThread->ProcessRequests(false);
 }
}
delete _log_datamodule;
}


 
malefik   (2007-07-11 13:42) [28]

тут уже код с переделками......небольшими....

_log_datamodule->_id_thread = GetCurrentThreadId();
засунул....п полу самого модуля


 
Сергей М. ©   (2007-07-11 13:52) [29]

Есть страшное предположение, что константа WM_CLIENT_LOG неоднозначна.


 
malefik   (2007-07-11 13:56) [30]

ставил

if (PeekMessage(&msg, NULL, 0,0, PM_NOREMOVE) != 0)

ливит только WM_TIMER

а так

#define WM_CLIENT_LOG (WM_USER + 20)


 
Сергей М. ©   (2007-07-11 14:02) [31]


> ливит только WM_TIMER


А до строчки ProcessRequestы() дело после этого доходит ?


 
malefik   (2007-07-11 14:05) [32]

а куда ему деватся то...


 
malefik   (2007-07-11 14:06) [33]

только для WM_TIMER касаемо

для WM_CLIENT_LOG даже до WaitMessage() не доходит


 
Сергей М. ©   (2007-07-11 14:08) [34]

И дальше, при исполнении этой строчки, ты соответственно попадаешьь в обработчик OnTimer, где, как ты говоришь, ф-ция PostThreadMessage() якобы успешно отправляет сообщение WM_CLIENT_LOG ?


 
malefik   (2007-07-11 14:13) [35]

Функция якобу успешно отправляет WM_CLIENT_LOG  из обоих таймеров .....ловит только в одном случае ...если отправлено с таймера лежащего в Tservice


 
Сергей М. ©   (2007-07-11 14:20) [36]


> malefik   (11.07.07 14:13) [35]


Ну прямо чудеса в решете)

А чудес не бывает. Значит что-то ты утаиваешь или искажаешь действительность.

Sleep(), кстати, зачем ?


 
malefik   (2007-07-11 14:33) [37]

могу исходники дать........

sleep плод очередного ксперимента


 
Reindeer Moss Eater ©   (2007-07-11 14:35) [38]

давно бы уже создал окно через AllocateHWnd и не парился


 
Сергей М. ©   (2007-07-11 14:35) [39]


> sleep плод очередного ксперимента
>


Эксперименты вообще-то должны быть осмысленными)

Я надеюсь, трассировку своего сервиса ты осуществляешь по всем правилам отладки-трассировки сервисов под управлением встр.отладчика ?


 
malefik   (2007-07-11 14:42) [40]

угу


 
clickmaker ©   (2007-07-11 14:49) [41]

может очередь сообщений не создается?
поставь
PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);
перед Wait...


 
Сергей М. ©   (2007-07-11 14:51) [42]

Пробуй так:

void __fastcall TSRVDozor::ServiceExecute(TService *Sender)
{
_start_srv();
MSG msg;
PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
PostThreadMessage(ServiceThread -> ThreadId, WM_CLIENT_LOG, 3, 5);
while (!Terminated)
{
 if (WaitMessage())
  {
      if(PeekMessage(&msg, -1 , WM_CLIENT_LOG, WM_CLIENT_LOG, PM_REMOVE) != 0)
      {
              _log_data_module->_write_to_log(msg.message,"asd",1,1);
      }
  ServiceThread->ProcessRequests(false);
  }
}
}


Сообщение наблюдаешь ?


 
Сергей М. ©   (2007-07-11 14:53) [43]


> может очередь сообщений не создается?


Создается.

Автор утверждает, что PostThreadMessage возвращает TRUE.


 
malefik   (2007-07-12 10:22) [44]

Короче вот такая картина....


void __fastcall TSRVDozor::ServiceExecute(TService* Sender)
{
_start_srv();
MSG msg;
_log_datamodule = new T_log_datamodule(this);
       _log_datamodule->_id_thread = GetCurrentThreadId();

PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
PostThreadMessage(_log_datamodule->_id_thread, WM_CLIENT_LOG, 0, 0);

while (!Terminated)
{
 if (WaitMessage())
 {
         Sleep(5);
  if (PeekMessage(&msg, NULL, WM_CLIENT_LOG, WM_CLIENT_LOG, PM_REMOVE) != 0)
  {
   _log_datamodule->_write_to_log(msg.message, "WM_CLIENT_LOG", 1, 1);
  }
  ServiceThread->ProcessRequests(false);
 }
}
delete _log_datamodule;
}



два таймера одновременно работают....один в дата модуле второй на модуле самого сервиса...

вот с таким кодом...


void __fastcall TSRVDozor::Timer1Timer(TObject *Sender)
{
_log_datamodule->_write_to_log(1, "SERVICE_TIMER", 1, 1);
//PostThreadMessage(_log_datamodule->_id_thread ,WM_CLIENT_LOG,0,0);
}

и в датамодуле


void __fastcall T_log_datamodule::_log_timerTimer(TObject* Sender)
{

_write_to_log(1, "LOG_TIMER", 1, 1);
PostThreadMessage(_id_thread ,WM_CLIENT_LOG,0,0);

//далее служебный код
if (FormatDateTime("hh:mm:ss", Time()) == "00:00:00")
{
 if (_ready)
 {
  _ready = false;
  FileClose(_file_handle);
  _prepare_log();
 }
}
}



смотрю сам лог файл.....


12:20:34|1|SERVICE_TIMER|1|1|
12:20:34|1|LOG_TIMER|1|1|
12:20:35|1|SERVICE_TIMER|1|1|
12:20:35|1|LOG_TIMER|1|1|
12:20:36|1|SERVICE_TIMER|1|1|
12:20:36|1|LOG_TIMER|1|1|
12:20:37|1|SERVICE_TIMER|1|1|
12:20:37|1|LOG_TIMER|1|1|
12:20:38|1|SERVICE_TIMER|1|1|
12:20:38|1|LOG_TIMER|1|1|
12:20:39|1|SERVICE_TIMER|1|1|
12:20:39|1|LOG_TIMER|1|1|
12:20:40|1|SERVICE_TIMER|1|1|
12:20:40|1|LOG_TIMER|1|1|
12:20:41|1|SERVICE_TIMER|1|1|
12:20:41|1|LOG_TIMER|1|1|
12:20:42|1|SERVICE_TIMER|1|1|
12:20:42|1|LOG_TIMER|1|1|


если делаю так


void __fastcall TSRVDozor::Timer1Timer(TObject *Sender)
{
_log_datamodule->_write_to_log(1, "SERVICE_TIMER", 1, 1);
PostThreadMessage(_log_datamodule->_id_thread ,WM_CLIENT_LOG,0,0);
}
........то

12:23:03|1|LOG_TIMER|1|1|
12:23:04|1|SERVICE_TIMER|1|1|
12:23:04|1044|WM_CLIENT_LOG|1|1|
12:23:04|1|LOG_TIMER|1|1|
12:23:05|1|SERVICE_TIMER|1|1|
12:23:05|1044|WM_CLIENT_LOG|1|1|
12:23:05|1|LOG_TIMER|1|1|
12:23:06|1|SERVICE_TIMER|1|1|
12:23:06|1044|WM_CLIENT_LOG|1|1|
12:23:06|1|LOG_TIMER|1|1|
12:23:07|1|SERVICE_TIMER|1|1|
12:23:07|1044|WM_CLIENT_LOG|1|1|
12:23:07|1|LOG_TIMER|1|1|
12:23:08|1|SERVICE_TIMER|1|1|
12:23:08|1044|WM_CLIENT_LOG|1|1|
12:23:08|1|LOG_TIMER|1|1|


СООБЩЕНИЕ ЛОВИТСЯ ......

ХОТЯ


void __fastcall T_log_datamodule::_log_timerTimer(TObject* Sender)
{

_write_to_log(1, "LOG_TIMER", 1, 1);

PostThreadMessage(_id_thread ,WM_CLIENT_LOG,0,0);


никуда не девался....


 
Сергей М. ©   (2007-07-12 10:37) [45]

Так.

Теперь выключи на время все свои таймеры и приведи содержимое лога для вот такого кода:

void __fastcall TSRVDozor::ServiceExecute(TService* Sender)
{
_start_srv();
MSG msg;
_log_datamodule = new T_log_datamodule(this);
      _log_datamodule->_id_thread = GetCurrentThreadId();

PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
PostThreadMessage(ServiceThread -> ThreadId, WM_CLIENT_LOG, 0, 0);

while (!Terminated)
{
if (WaitMessage())
{
 if (PeekMessage(&msg, NULL, WM_CLIENT_LOG, WM_CLIENT_LOG, PM_REMOVE) != 0)
 {
  _log_datamodule->_write_to_log(msg.message, "WM_CLIENT_LOG", 1, 1);
 }
 ServiceThread->ProcessRequests(false);
}
}
delete _log_datamodule;
}



 
ага   (2007-07-12 11:14) [46]

>Я надеюсь, трассировку своего сервиса ты осуществляешь по всем правилам отладки-трассировки сервисов под управлением встр.отладчика ?

угу


А нифига не угу. Твои сообщения из очереди ServiceThread->ProcessRequests забираить.
У тя таймер сработал - ты ушел в ProcessRequests. Тот вынул из очереди WM_TIMER и обработал, а енный обработчик добавил в очередь WM_CLIENT_LOG. ProcessRequests опять проверяет очередь - а вот он радимый, да тока куда ево девать не знаить. Ну и выбрасывает ево канечна.
Вывод - надоть окошко делать и ему слать, енто самое простое.


 
ага   (2007-07-12 11:21) [47]

Да, наверна надоть и про ето сказать, хе-хе:)

Когда на TService таймер кидашь, то ен в главном потоке создается, тудыть и WM_TIMER приходють и с ServiceThread->ProcessRequests енто дело не пересекаетьси


 
malefik   (2007-07-12 11:28) [48]


> Когда на TService таймер кидашь, то ен в главном потоке
> создается, тудыть и WM_TIMER приходють и с ServiceThread-
> >ProcessRequests енто дело не пересекаетьси
>


я вот тоже думал про разные треды......када поюзал сервис SPY++


 
Сергей М. ©   (2007-07-12 11:29) [49]


> ага   (12.07.07 11:14) [46]


> Ну и выбрасывает ево канечна


А это

12:23:03|1|LOG_TIMER|1|1|
12:23:04|1|SERVICE_TIMER|1|1|
12:23:04|1044|WM_CLIENT_LOG|1|1|

тогда откуда взялось, если "выбрасывает" ?

По-хорошему следует перекрыть DoCustomControl (на то он и есть виртуальный) и в его теле обрабатывать свои польз.сообщения. Правда, при этом возникают сложности с передачей параметров сообщения, но и это вполне решаемо.


 
malefik   (2007-07-12 11:31) [50]


> Теперь выключи на время все свои таймеры и приведи содержимое
> лога для вот


один раз

13:31:58|1044|WM_CLIENT_LOG|1|1|


 
Сергей М. ©   (2007-07-12 11:31) [51]


> Когда на TService таймер кидашь, то ен в главном потоке
> создается


Точно)
Я как-то упустил из вида этот крайне важный в дан.ситуации момент.


 
Сергей М. ©   (2007-07-12 11:32) [52]


> malefik   (12.07.07 11:31) [50]


Ну вот тебе и подтверждение [46] и [47]


 
ага   (2007-07-12 11:48) [53]

Ну да можна и DoCustomControl, я об ентом первым делом подумал:) Тока тады придетса WParam под код управления отдать, у нево типа как обе параметры испльзуить
PostThreadMessage(SRVDozor->_id_thread,WM_CLIENT_LOG,3,5);


 
malefik   (2007-07-12 11:55) [54]

по поводу 46 немного не догоняю.....

procedure TServiceThread.ProcessRequests(WaitForMessage: Boolean);
const
 ActionStr: array[1..5] of String = (SStop, SPause, SContinue, SInterrogate,
   SShutdown);
var
 msg: TMsg;
 OldStatus: TCurrentStatus;
 ErrorMsg: String;
 ActionOK, Rslt: Boolean;
begin
 while True do
 begin
   if Terminated and WaitForMessage then break;
   if WaitForMessage then
     Rslt := GetMessage(msg, 0, 0, 0)
   else
     Rslt := PeekMessage(msg, 0, 0, 0, PM_REMOVE);


Можно объяснить почему??

Каца я начинаю въезжать......после отлова WM_TIMER - таймер шлет мое сообщение которое перехватывает в еще не закончившемся круге
ServiceThread->ProcessRequests(false); обрабатывает его ......кодом ВЫШЕ...и я КУРЮ....НО ......

поток то я тот указывал ......для

void __fastcall T_log_datamodule::_log_timerTimer(TObject* Sender)
{

_write_to_log(1, "LOG_TIMER", 1, 1);
PostThreadMessage(_id_thread ,WM_CLIENT_LOG,0,0);



 
malefik   (2007-07-12 12:03) [55]

думаю что AllocateHWnd будет лучший выход


 
Сергей М. ©   (2007-07-12 12:25) [56]


> обрабатывает его ......кодом ВЫШЕ


..
   if msg.hwnd = 0 then { Thread message }
   begin
     if msg.message = CM_SERVICE_CONTROL_CODE then
     begin
..
     end else
       DispatchMessage(msg); <- вот здесь твое сообщение выкидывается нафих
   end else
     DispatchMessage(msg);


 
Сергей М. ©   (2007-07-12 12:28) [57]


> AllocateHWnd будет лучший выход


Но при этом ты будешь вынужден сделать сервис интерактивным (по умолчанию - False), иначе он не будет получать адресованные этому окну сообщения.


 
Сергей М. ©   (2007-07-12 12:30) [58]


> malefik   (12.07.07 12:03) [55]


Идеальное решение - обмен данными с сервисом при помощи NamedPipes.


 
malefik   (2007-07-12 12:55) [59]

Rslt := PeekMessage(msg, 0, 0, 0, PM_REMOVE);
тут оно удаляется из очереди.....чого бы я не очень хотел.....

> NamedPipes.

Как насчет безопасности???


 
ага   (2007-07-12 13:01) [60]

по поводу 46 немного не догоняю.....

Ну ты смотри. Пришел те WM_TIMER и ты попал в ProcessRequests. Че тот делает? Пока PeekMessge вертает истину он крутит цикл. Значить че происходит. Сначала вызывает обработчик WM_TIMER, тот добавит в очередь твой WM_CLIENT_LOG, дальше ProcessRequests пойдеть опять по циклу то бишь вызоветь PeekMessage, а тот найдеть в очереди WM_CLIENT_LOG ну и забереть ево оттедова. Секешь? Ну  а куды вон ево денет? Правильно Сергей сказал

if msg.message = CM_SERVICE_CONTROL_CODE then
begin
...
end else
   DispatchMessage(msg);

А куды ему ево отправлять ежли окно=0? Я б сказал да правила форума запрящають:) Ну да ты небось и сам знашь:))

>Но при этом ты будешь вынужден сделать сервис интерактивным

А нафига интерактивный-та? Ему ж не от юзера нать мессаги принимать, от свово ж потока. Дык усе потоки сервиса на одном десктопе вертятся и сообщения друг дружке и без интерактивности дайдуть. Тем боле ежли поток шлеть самому себе. Иль я чево опять не понял?:) Десктоп он вроде не меняет...


 
Сергей М. ©   (2007-07-12 13:03) [61]


> тут оно удаляется из очереди


Ну а как же иначе ?

Ведь если далее по коду будет принято решение о необходимости его обработки (или диспетчеризации по умолчанию), сообщение к этому моменту должно быть выбрано из очереди, а иначе его никак не "выковырять" - простое удаление сообщения из очереди (без его чтения при этом) системой не предусмотрено.


> Как насчет безопасности?


А что с ней не в порядке ?
Какие сомнения ?
И почему вопрос о какой-то там "безопасности" не возник у тебя при попытке организовать обмен посредством сообщений ?


 
Сергей М. ©   (2007-07-12 13:07) [62]


> Ему ж не от юзера нать мессаги принимать, от свово ж потока


Мне кажется, что таймер здесь был использован в кач-ве эксперимента.

А конечная цель - организация обмена данными с сервисом со стороны произвольного процесса.


 
ага   (2007-07-12 13:23) [63]

>А конечная цель - организация обмена данными с сервисом со стороны произвольного процесса.

А ну тады да. Тады канешна нать како-нить другой канал. И пайпы как раз в точку. Хотя и другие способы есть, но тут уж нать подробности задачи знать


 
malefik   (2007-07-12 14:02) [64]

Лана пасиба Камрады....буду ваять....



Страницы: 1 2 вся ветка

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

Наверх




Память: 0.64 MB
Время: 0.025 c
15-1183741027
bagos
2007-07-06 20:57
2007.08.05
Интерфейсы программ


6-1167082328
Иван_
2006-12-26 00:32
2007.08.05
Как заменить спец символы в URL?


1-1180103569
DevilDevil
2007-05-25 18:32
2007.08.05
TTabControl VS Manifest


2-1183965289
Pohil
2007-07-09 11:14
2007.08.05
Перекомпиляция модулей


2-1184057982
click
2007-07-10 12:59
2007.08.05
Нарисовать тень...