Форум: "Сети";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];
ВнизTidtcpclient и пример из Indy Найти похожие ветки
← →
Hereticsoul © (2005-05-18 16:25) [0]Здраствуйте.
Вообщем необходимо написать локальный чат, решил попробовать построить на компонентах Indy.Скачал пример чата с их сайта, но так и не понял как это должно работать...потому что в клиентской часть приложения висит таймер 500 м/с и выполняет следующее :
[code] var
Com,
Msg : String;
begin
if not IdTcpClient1.Connected then
exit;
Msg := IdTCPClient1.ReadLn("", 5);
if Msg <> "" then
if Msg[1] <> "@" then
begin
{ Not a system command }
memLines.Lines.Add(Msg);
end
else
begin
{ System command }
Com := UpperCase(Trim(Copy(Msg, 2, Pos(":", Msg) -2)));
Msg := UpperCase(Trim(Copy(Msg, Pos(":", Msg) +1, Length(Msg))));
if Com = "CLIENTS" then
lbClients.Items.CommaText := Msg;
end;[/code]
отсюда видно что сам IdTcpClient1 постоянно(раз в 500м/с) пытается читать что ему там прислале....все прекрасно если бы не одно но весь интерфейс просто зависайт....и вся программа "отдается" и зависает пока что либо не пришлют.....но этож не дело...в связи с тем и вопрос как узнать что что-то прислали на IdTcpClient1 ???
← →
Hereticsoul © (2005-05-18 16:26) [1]Простите за очепятки....конец рабочего дня все-таки )))
← →
Digitman © (2005-05-18 16:57) [2]
> потому что в клиентской часть приложения висит таймер 500
> м/с и выполняет следующее
что-то слабо верится, что разработчики Indy могли такую глупость сморозить - использовать таймер для оной цели
> отсюда видно что сам IdTcpClient1 постоянно(раз в 500м/с)
ничего отсюда не видно .. в твоем коде нет нигде упоминания о "500"
это что, обработчик OnTimer у тебя или что ?
← →
Hereticsoul © (2005-05-19 09:30) [3]
> что-то слабо верится, что разработчики Indy могли такую
> глупость сморозить - использовать таймер для оной цели
прежде чем верить или нет по логике вещей можно просто посмотреть:
http://www.projectindy.org/DemoDownloads/Indy9Demos_26Oct04.zip
(1,3 мб)
> ничего отсюда не видно .. в твоем коде нет нигде упоминания
> о "500"
>
> это что, обработчик OnTimer у тебя или что ?
простите,ну не видно зато сказано...да это обработчик OnTimer...
А что делать - это вопрос!
в принципе это лечиться если положить на форму TidAntiFreeze...но это не дело потому что все подлагивает.
тут я вижу решение что можно отслеживать есть ли что-то что можно прочитать и если есть то читать (Msg := IdTCPClient1.ReadLn("", 5);) в противном случае выходить из обработчика OnTimer...но как реализовать не знаю (((...
Вообще у Tclientsocket есть обработчик OnDataRecieve (или как-то так)...было удобно....только вся прелесть Indy в том что бы автоматически у Tidtcpserver все connections пускать в разные потоки TidTreadMgr это очень удобно а у TServersocket это еще надо реализовывать я не против но время не резиновое к сожалению.....ну наверняка кто-то сталкивался с этой проблемой )))
← →
Reindeer Moss Eater © (2005-05-19 09:46) [4]тут я вижу решение что можно отслеживать есть ли что-то что можно прочитать и если есть то читать (Msg := IdTCPClient1.ReadLn("", 5);) в противном случае выходить из обработчика OnTimer...но как реализовать не знаю (((...
Ничего не надо отслеживать.
Возврат из ReadLn происходит либо когда прочитана строка, либо наступил таймаут (второй параметр)
Выход из обрабочика там уже реализован
if Msg <> "" then ...
← →
Hereticsoul © (2005-05-19 09:51) [5]Ничего не надо отслеживать.
Возврат из ReadLn происходит либо когда прочитана строка, либо наступил таймаут (второй параметр)
Выход из обрабочика там уже реализован
if Msg <> "" then ...
Я вижу...но как факт программа-то висит в смысле по таймауту в
5 м/с (IdTCPClient1.ReadLn("", 5);) работа не прекращается...
← →
Reindeer Moss Eater © (2005-05-19 09:59) [6]Значит твоя версия инди с глюком реализации таймаута чтения
← →
Hereticsoul © (2005-05-19 10:08) [7]V 9.00.10
← →
Digitman © (2005-05-19 10:09) [8]
> а у TServersocket это еще надо реализовывать
все там уже реализовано в этом плане
> в принципе это лечиться если положить на форму TidAntiFreeze...но
> это не дело потому что все подлагивает.
антифриз этот в конечном итоге периодически вызывает Application.ProcessMessages (или его аналог, не помню)
либо ты возлагаешь эту заботу на антифриз либо по истечению очередного ожидания таймаута в 5 мс сам делаешь тоже самое ... третьего не дано ..
а таймер - вот это точно "не дело"
← →
Reindeer Moss Eater © (2005-05-19 10:14) [9]Вообще у Tclientsocket есть обработчик OnDataRecieve (или как-то так)...было удобно....
Ну дык и используй его в клиенте.
← →
Hereticsoul © (2005-05-19 10:41) [10]2Reindeer Moss Eater
Млин а ты прав...протокол -то один...ведь клиент не обязательно должен быть "от" Indy ...спасибо.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2005.09.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c