![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему не работает ? (TIdTCPClient и TIdTCPServer)
SemFLY © (2003-06-26 16:52:00)
Привет :)
Проблема такая…
В Delphi 7 использую компонет TIdTCPClient и TIdTCPServer.
Кидаю всё это на одну форму и ставлю соединяться с localhost по порту 777…
Все соединятся, но когда я пытаюсь закрыть приложение, посылая команду ‘ exit ’ то ничего не происходит… :(
Приложение не закрывается… на старых компонентах всё работало в Delphi 5, а тут нет :(
Код такой:
procedure TForm1.Button2Click(Sender: TObject);
begin
Client.WriteLn(Edit1.Text)
end;
procedure TForm1.ServerExecute(AThread: TIdPeerThread);
var
s:string;
begin
s := AThread.Connection.ReadLn;
if s = "exit" then
begin
AThread.Connection.Disconnect;
Close;
end;
end;
Почему так происходит ?
SemFLY (2003-06-28 14:52:00) [1]C процедурой Close тоже понятно :)
- - -
nikkie, что посоветуешь, как лучше сделать на компонентах TIdTCPClient и TIdTCPServer типа сервера...
Задача такая:
отправляется текстовая команда, анализируется, и из списка case выбирается её номер и происходит выполнение процедуры...
пример команды оптравляемой на сервер TIdTCPServer:
02+#13#10+param
-
02 - номер команды
#13#10 - переводим каретку, таким образом можем передать множество параметров
param - сам параметр
---
Вообщем сделать аналог этого:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);
var
Command, FuncPR: String;
CN : Integer;
begin
with Socket do
begin
Command := ReceiveText;
CN := StrToInt(Copy(Command,1,2));
Delete(Command,1,2);
FuncPR := Copy(Command,1,Length(Command));
end;
with Proc do
begin
case CN of
( FuncPR)C процедурой Close тоже понятно :)
- - -
nikkie, что посоветуешь, как лучше сделать на компонентах TIdTCPClient и TIdTCPServer типа сервера...
Задача такая:
отправляется текстовая команда, анализируется, и из списка case выбирается её номер и происходит выполнение процедуры...
пример команды оптравляемой на сервер TIdTCPServer:
02+#13#10+param
-
02 - номер команды
#13#10 - переводим каретку, таким образом можем передать множество параметров
param - сам параметр
---
Вообщем сделать аналог этого:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);
var
Command, FuncPR: String;
CN : Integer;
begin
with Socket do
begin
Command := ReceiveText;
CN := StrToInt(Copy(Command,1,2));
Delete(Command,1,2);
FuncPR := Copy(Command,1,Length(Command));
end;
with Proc do
begin
case CN of
01 : ExecFile(FuncPR);
02 : Close;
end;
end;
nikkie (2003-06-28 01:11:00) [2]
Для выполнения кода в контексте основного потока VCL предлагает метод TThread.Synchronize:
AThread.Synchronize(Close);
Либо можно воспользоваться синхронизацией, которую обеспечит windows при посылке сообщений окну другого потока:
SendMessage(Handle, WM_CLOSE, 0, 0);
SemFLY (2003-06-28 00:50:00) [3]
Ок, понял, а как мне тогда сделать по аналогии с тем, что я сделал в Delphi 5 ?
nikkie (2003-06-27 23:37:00) [4]
читай еще раз:
>если ты будешь в доп.код.потоке обращаться к VCL без синхронизации с основным потоком
>ведь обработчик ServerExecute() исполняется в контексте кодового потока AThread: TIdPeerThread !!
SemFLY (2003-06-27 19:04:00) [5]
как это на страрых ?????!!!!! Все будет и ещё как !!!! :))
Работает 100% !
- - -
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);
var
Command, FuncPR: String;
CN : Integer;
begin
with Socket do
begin
Command := ReceiveText;
CN := StrToInt(Copy(Command,1,2));
Delete(Command,1,2);
FuncPR := Copy(Command,1,Length(Command));
end;
with Proc do
begin
case CN of
01 : ExecFile(FuncPR);
02 : Close;
end;
end;
- - -
это все написано в Delphi 5.0 и как я уже сказал работает прекрасно !
- - -
Сейчас я поставил Delphi 7.0 в ней тока TIdTCPClient и TIdTCPServer есть, хочу перевести все на эти компоненты, но увы вот возникла проблема...
Digitman (2003-06-27 17:46:00) [6]
и на старых компонентах работать не будет, если ты будешь в доп.код.потоке обращаться к VCL без синхронизации с основным потоком
ведь обработчик ServerExecute() исполняется в контексте кодового потока AThread: TIdPeerThread !!
не разобрался еще со старыми компонентами, а уже зачем-то в Indy тебя понесло))) ... чем они плохи были для тебя - ума не приложу)
SemFLY (2003-06-27 17:29:00) [7]
Подскажите... ;)