Главная страница
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]

угу



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

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

Наверх




Память: 0.56 MB
Время: 0.025 c
2-1183996257
hgd
2007-07-09 19:50
2007.08.05
Процедура sleep


15-1184061961
Piter
2007-07-10 14:06
2007.08.05
TBitmap в windows.pas и в graphics.pas


15-1184082932
koha
2007-07-10 19:55
2007.08.05
есть ли нормы на обслуживание выч. техники?


15-1184130519
db2admin
2007-07-11 09:08
2007.08.05
Как положить программно SMPPSim?


2-1183357698
Washington
2007-07-02 10:28
2007.08.05
Удаление таблицы Access