Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];

Вниз

Обработка сообщений в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.63 MB
Время: 0.045 c
11-1167056057
mixail_shar
2006-12-25 17:14
2007.08.05
MCK UNICODE


1-1180360269
timonissimo
2007-05-28 17:51
2007.08.05
TMainMenu :чтобы меню разместилось на всех формах


1-1179985999
Бульбаш
2007-05-24 09:53
2007.08.05
Возможно ли реализовать средствами Delphi?


15-1183659935
Rouse_
2007-07-05 22:25
2007.08.05
WNetEnumCachedPasswords


15-1183981766
Pashok
2007-07-09 15:49
2007.08.05
заблокирован DVD привод (Lite-on DVDRW SHM-165 P6S)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский