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

угу



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

Форум: "Прочее";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.039 c
2-1183969621
>>DEATH<<
2007-07-09 12:27
2007.08.05
md5


1-1179996867
Tonich
2007-05-24 12:54
2007.08.05
Вызов функции из dll


15-1183616943
Vlad Oshin
2007-07-05 10:29
2007.08.05
Психология. Опрос.


15-1184208227
Slider007
2007-07-12 06:43
2007.08.05
С днем рождения ! 12 июля 2007 четверг


2-1184137180
greg123
2007-07-11 10:59
2007.08.05
Получение информации из blob-поля





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