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