Форум: "Прочее";
Текущий архив: 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.052 c