Не ловятся месаги в службе....почему??
От: malefik  
Дата: 31.05.07 09:53
Оценка:
вобщем ...
Код:



void __fastcall TMyService::ServiceExecute(TService *Sender) 
{ 
  _start_srv(); 

  MSG msg; 
  while (!Terminated) 
 { 
    if (WaitMessage()) 
    { 
        if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) != 0) 
        { 
              this->LogMessage(msg.message, EVENTLOG_ERROR_TYPE, 0, 0); 
        } 
    ServiceThread->ProcessRequests(false); 
    } 
  } 

}


не ловит мессаги отправляемые в TTimer такими операторами
Код:



PostMessage(NULL,WM_CLIENT_LOG,0,0 ); 
PostThreadMessage(GetCurrentThreadId() ,WM_CLIENT_LOG,0,0);



хотя само WM_TIMER ежесекундно ловит

ПОЧЕМУ??


31.05.07 15:50: Перенесено модератором из 'C/C++' — Odi$$ey
Re: Не ловятся месаги в службе....почему??
От: Ovl Россия  
Дата: 31.05.07 11:46
Оценка:
M>не ловит мессаги отправляемые в TTimer такими операторами

PostMessage(NULL, ...) является полным аналогом PostThreadMessage(GetCurrentThreadId(), ...), то есть — запускает мессадж в текущий тред.
Отсюда вопрос: вы делаете PostMessage в том же треде что и WaitMessage?
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[2]: Не ловятся месаги в службе....почему??
От: malefik  
Дата: 31.05.07 15:44
Оценка:
Ovl>Отсюда вопрос: вы делаете PostMessage в том же треде что и WaitMessage?


Да! компонент лежит на невизуальной форме сервиса....
Re[3]: Не ловятся месаги в службе....почему??
От: Ovl Россия  
Дата: 01.06.07 10:41
Оценка:
Здравствуйте, malefik, Вы писали:

Ovl>>Отсюда вопрос: вы делаете PostMessage в том же треде что и WaitMessage?



M>Да! компонент лежит на невизуальной форме сервиса....



если вы сделаете вот так, то оно поймается?


void __fastcall TMyService::ServiceExecute(TService *Sender) 
{ 
  _start_srv(); 

  MSG msg; 
  while (!Terminated) 
 { 
    if (WaitMessage()) 
    { 
        if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) != 0) 
        { 
              this->LogMessage(msg.message, EVENTLOG_ERROR_TYPE, 0, 0); 
        } 
        PostThreadMessage(GetCurrentThreadId() ,WM_CLIENT_LOG,0,0);
        ServiceThread->ProcessRequests(false); 
    } 
  } 

}
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[4]: Не ловятся месаги в службе....почему??
От: Аноним  
Дата: 03.06.07 04:24
Оценка:
ДА ловит...в

void __fastcall TMyService::ServiceExecute(TService *Sender) 
{ 
_start_srv(); 

MSG msg; 
while (!Terminated) 
{ 
PostThreadMessage(GetCurrentThreadId() ,WM_CLIENT_LOG,0,0);

  if (WaitMessage()) 
 { 
     if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) != 0) 
 { 
              this->>LogMessage(msg.message, EVENTLOG_ERROR_TYPE, 0, 0); 
} 
 ServiceThread->ProcessRequests(false); 
} 
} 

}



отседа вопрос как прально получить threadid?
еще работает в таймере с MyService->ServiceThread->ThreadID
с GetCurrentThreadId() никак
Re[5]: Не ловятся месаги в службе....почему??
От: malefik  
Дата: 03.06.07 04:25
Оценка:
прошу прощения не вошел...
Re[5]: Не ловятся месаги в службе....почему??
От: Ovl Россия  
Дата: 04.06.07 08:09
Оценка:
А>отседа вопрос как прально получить threadid?
А>еще работает в таймере с MyService->ServiceThread->ThreadID
А>с GetCurrentThreadId() никак

GetCurrentThreadId() — возвращает ThreadId для места вызова. Просто не факт что это тот, что вам нужен. Вам нужен ThreadId места, где вызывается WaitMessage.

посмотрите чему равно GetCurrentThreadId() в обоих местах. Если есть необходимость — запомните значение ThreadId для WaitMessage() и используйте его в PostMessage
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[6]: Не ловятся месаги в службе....почему??
От: malefik  
Дата: 09.06.07 06:14
Оценка:
вобщем работать стало ......если на "форму" (прошу прощения за выражение) сервиса бросить таймер.....и в обработчике его написать

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);
    }
  }
}



НО НЕ РАБОТАЕТ ЕСЛИ В ДОПОЛНИТЕЛЬНОМ DATAMODULE добавить Таймер

и слать оотуда


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


Почему???????????
Re[7]: Не ловятся месаги в службе....почему??
От: Аноним  
Дата: 21.06.07 05:16
Оценка:
актуально
Re[7]: Не ловятся месаги в службе....почему??
От: Аноним  
Дата: 21.06.07 18:43
Оценка:
M>НО НЕ РАБОТАЕТ ЕСЛИ В ДОПОЛНИТЕЛЬНОМ DATAMODULE добавить Таймер

M>и слать оотуда



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


M>Почему???????????


Простите, а кто должен дергать этот таймер? DataModule — это просто площадка для накидывания невизуальных компонент. Очереди сообщений (и активации таймера соответственно) она не имеет, если память не изменяет. Т.е. таймер просто не получит управления.
Re[8]: Не ловятся месаги в службе....почему??
От: Аноним  
Дата: 22.06.07 03:24
Оценка:
Здравствуйте, Аноним, Вы писали:


M>>НО НЕ РАБОТАЕТ ЕСЛИ В ДОПОЛНИТЕЛЬНОМ DATAMODULE добавить Таймер


M>>и слать оотуда



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


M>>Почему???????????


А>Простите, а кто должен дергать этот таймер? DataModule — это просто площадка для накидывания невизуальных компонент. Очереди сообщений (и активации таймера соответственно) она не имеет, если память не изменяет. Т.е. таймер просто не получит управления.


Думаю что имеет...вам стоит проверить это элементарным образом.....

void __fastcall T_log_datamodule::_log_timerTimer(TObject* Sender)
{
SRVDozor->LogMessage("ZZZ.", EVENTLOG_ERROR_TYPE, 0, 0);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.