![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ClientSocket в Com объекте - срочно Help [D6, Win2k]
adv © (2003-10-03 13:56:00)
Подскажите, плз: не получается сабж. ClientSocket открываю в потоке, тип сокета ctNonBlocking, при вызове Synchronize(ClientSocket.Open) Com объект умирает быстро и без писка. Проблема проявляется только при переносе модуля в COM объект- в обычном приложении все работает. Заранее спасибо всем откликнувшимся.
Digitman (2003-10-06 09:16:00) [1]
в принципе все это вполне организуемо и в рамках одного и того же потока службы...
adv (2003-10-06 08:53:00) [2]
> а зачем ты организуешь в службе еще один доп.код.поток ?
Хотел сделать: первый поток опрашивает сетевой ресурс на предмет появления новых файлов и переписывает их на локальный ресурс. Второй - рассылает обнаруженные файлы в локальном ресурсе по коннектам. А сама служба рулит потоками (лог ошибок, перезапуск потоков и прочее).
Digitman (2003-10-06 08:14:00) [3]
> ЧТО ЗА
стук в подвале) .... что еще сказать ?
> при попытке написать службу на Delphi
а зачем ты организуешь в службе еще один доп.код.поток ? объясни
код службы и так уже выполняется в отдельном код.потоке
adv (2003-10-06 04:29:00) [4]
Да нет - заработало. А исключение
try Socket.open except on E:Exception do MessageBox(0,PChar(E.ClassName + " " + E.Message),"Error",0); end;не ловит. Убрал Try except - работает. ничего больше не менял. ЧТО ЗА ??? Кстати подобное поведение обнаружил при попытке написать службу на Delphi (пришлось на VС писать), а еще он часто в обоих случаях валиться с исключением ядра D6. Это мой глюк или фича D6?
Digitman (2003-10-03 15:32:00) [5]
ну, положим, еще ничего не заработало)
ибо ты только обнаружил по моему настоянию, что COM-сервер твой падает из-за необработанного в потоке исключения
теперь - задача выяснить, кто или что является источником такого исключения ... и уж потом принимать адекв.меры
скорректируй код таким образом :
on E:Exception do
MessageBox(0,PChar( E.ClassName+ " " + E.Message),"Error",0);
о том что ты увидишь в сообщении - доложишь дословно))
Digitman (2003-10-03 15:14:00) [6]
еще раз повторяю - ты заключил код Execute() в скобки try..except ? каков результат ?
adv (2003-10-03 15:14:00) [7]
все заработало, большой сенкс. а что это могло быть?
on E:Exception do MessageBox(0,PChar(E.Message),"Error",0);ничего не дало. еще раз спасибо.
adv (2003-10-03 15:01:00) [8]
нет. Назначение приложения - постоянный опрос сервера, если пришла инфа, парсить, заполнять свойства COM объекта, чтобы сторонняя прилада (SCADA) считала эту инфу. 2 потока - один на прием инфы от сервера, другой на обслугу запросов хозяина (SCADA), можно конечно половить сообщения и попробывать определиться с ошибкой, но мне кажется что это где то на поверхности. Может кто знает где копать. Повторюсь но в обычном приложении все ок
Digitman (2003-10-03 14:59:00) [9]
> adv
для начала сделай так
procedure TMyThread.Execute;
begin
try
..... // здесь вся твоя кухня с гнездами и пр.
except
end;
end;
о результатах (падает COM-сервер после этого или перестал) доложишь)
Polevi (2003-10-03 14:51:00) [10]
цикл обработки сообщений есть в потоке ?
adv (2003-10-03 14:45:00) [11]
От безысходности :-(. Уже не знаю в чем проблема, вот и извращаюсь
Digitman (2003-10-03 14:00:00) [12]
а зачем ? зачем синхронизировать метод ClientSocket.Open ? смысл ?