![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OnExecute для TIdTCPClient [D6]
alexEagle © (2003-12-22 15:45:00)
Когда я отсылаю сообщение серверу (TIdTCPServer) , у него срабатывает метод OnExecute. Как мне организовать такой же метод обработки сообщений для клиента?
Таймер не предлагать!
С уважением, Сорокин А.Е.
GoldenFILL (2004-01-04 10:11:00) [1]
Попробуй использовать нить
TClientThread = class(TThread)
private
Msg: String;
procedure ReadLine;
protected
procedure Execute; override;
end;
var
MainForm: TMainForm;
ClientThread: TClientThread;
implementation
{$R *.dfm}
procedure TClientThread.ReadLine;
begin
MainForm.ListBox.Items.Add(Msg);
end;
procedure TClientThread.Execute;
begin
while not Terminated do
if MainForm.TCPClient.Connected then
begin
Msg := MainForm.TCPClient.ReadLn();
if Msg <> "" then
ReadLine;
end
else
Terminate;
end;
procedure TMainForm.TCPClientConnected(Sender: TObject);
begin
ClientThread := TClientThread.Create(True);
ClientThread.FreeOnTerminate := True;
ClientThread.Resume;
end;
S@shka (2003-12-22 20:04:00) [2]
Indy компоненты асинхронные
там нельзя поменять как в TClientSocket блокируемый или неблокируемый сокет.
Он вегда блокируемый
Соответствено нет никаго Execute у Клиента (не предусматриваолсь)
alexEagle (2003-12-22 18:54:00) [3]
Видимо придется
psn (2003-12-22 18:33:00) [4]
а почему бы не использовать компоненты TClientSocket и TServerSocket?
alexEagle (2003-12-22 17:41:00) [5]
Зря, в онглайне такие вопросы быстрее решаются, а иначе получается та же модель (по таймеру) только при этом ридишь ты сам.
Reindeer Moss Eater (2003-12-22 17:34:00) [6]
Я ею не пользуюсь.
alexEagle (2003-12-22 17:32:00) [7]
Reindeer Moss Eater © (22.12.03 17:30) [15]
Аську свою дай
Reindeer Moss Eater (2003-12-22 17:30:00) [8]
[9]
alexEagle (2003-12-22 17:29:00) [9]
Reindeer Moss Eater © (22.12.03 17:24) [13]
C:\Program Files\Borland\Delphi6\Demos\Internet\Chat\Client
для обработки сообщений от сервера используетс следующий код
procedure TForm1.Timer1Timer(Sender: TObject);
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;
end;
=====================================
Все класно, но мне нужно без таймера
Reindeer Moss Eater (2003-12-22 17:24:00) [10]
В примерах к библиотеке с которой ты работаешь (TidTCPClient) нет примеров с использованием таймера.
alexEagle (2003-12-22 17:21:00) [11]
Reindeer Moss Eater © (22.12.03 17:10) [11]
Я вообще недавно занимаюсь разработкой клиент-серверных приложений, а нельзя ли мне объяснить поподробнее каким образом такое произошло? Я взял компоненты из примеры и там были асинхронные методы а у меня стали синхронными?
Reindeer Moss Eater (2003-12-22 17:10:00) [12]
В примерах, которые я просмотрел,я видел лишь опрос сокета по таймеру на клиенте и мне не хотелось бы так делать.
Ты видел примеры для компонентов с асинхроннымиметодами, а сам связался с компонентами имеющими синхронныеметоды.
Все что тебе надо - вариации на тему [9]
alexEagle (2003-12-22 17:08:00) [13]
Подробнее:
У меня есть сервер TCP на котороя я делаю опрос COM-порта по таймеру, с некоторым интервалом, и должен разослать результаты опроса все своим клиентам.
При этом хотелось бы чтобы у клиента в момент получения данных срабатывало некоторое событие (как, например, в сервере OnExecute).
В примерах, которые я просмотрел,я видел лишь опрос сокета по таймеру на клиенте и мне не хотелось бы так делать.
Именно поэтому я и задал вопрос в этот форум.
P.S. Ответы вроде "нет там таких", "...и не надо" просьба не присылать - ничего полезного они не содержат в себе.
Reindeer Moss Eater (2003-12-22 16:59:00) [14]
repeat
idTcpClient1.Read....
....
case SomeThing of
.....
end
until false;
savva (2003-12-22 16:58:00) [15]
> alexEagle © (22.12.03 16:52) [7]
> Digitman -> Просьба больше не присылать свои пустые ответы
я думаю остановиться стоит тебе.. как был задан вопрос - такие ответы.. я например до сих пор не понял - зачем тебе это надо.. и даже не понял - что " это".. объяснишь попонятнее?
alexEagle (2003-12-22 16:52:00) [16]
Digitman -> Просьба больше не присылать свои пустыеответы
Digitman (2003-12-22 16:44:00) [17]
> значит нужно
мало ли чео тебе "нужно" !
соотв.клиент там реализован иначе ! нет там никаких OnExecute) ...и - слава богу, что так)
alexEagle (2003-12-22 16:29:00) [18]
Digitman -> IMHO если вопрос возник, значит нужно.
ALL -> А вообще, если кто не понял, то я не ищу метод OnExecute у клиента!
Мне просто нужно организовать подобную обработку, поэтому если есть варианты у кого-нибудь, то готов рассмотреть.
Digitman (2003-12-22 16:23:00) [19]
> Как мне организовать такой же метод обработки сообщений
> для клиента?
нахрена ? imho, идиотская логика у события OnExecute() !
alexEagle (2003-12-22 16:22:00) [20]
Специально для S@shka:
Таймер не предлагать!было написано потому, что этот подход я и так знаю, но он мне не нравится. Объяснять почему не нравится - не хочу, и не спрашивать