Форум: "Сети";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
ВнизПочему не работает ? (TIdTCPClient и TIdTCPServer) Найти похожие ветки
← →
SemFLY (2003-06-26 16:52) [0]Привет :)
Проблема такая…
В 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-27 17:29) [1]Подскажите... ;)
← →
Digitman (2003-06-27 17:46) [2]и на старых компонентах работать не будет, если ты будешь в доп.код.потоке обращаться к VCL без синхронизации с основным потоком
ведь обработчик ServerExecute() исполняется в контексте кодового потока AThread: TIdPeerThread !!
не разобрался еще со старыми компонентами, а уже зачем-то в Indy тебя понесло))) ... чем они плохи были для тебя - ума не приложу)
← →
SemFLY (2003-06-27 19:04) [3]как это на страрых ?????!!!!! Все будет и ещё как !!!! :))
Работает 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 есть, хочу перевести все на эти компоненты, но увы вот возникла проблема...
← →
nikkie (2003-06-27 23:37) [4]читай еще раз:
>если ты будешь в доп.код.потоке обращаться к VCL без синхронизации с основным потоком
>ведь обработчик ServerExecute() исполняется в контексте кодового потока AThread: TIdPeerThread !!
← →
SemFLY (2003-06-28 00:50) [5]Ок, понял, а как мне тогда сделать по аналогии с тем, что я сделал в Delphi 5 ?
← →
nikkie (2003-06-28 01:11) [6]Для выполнения кода в контексте основного потока VCL предлагает метод TThread.Synchronize:
AThread.Synchronize(Close);
Либо можно воспользоваться синхронизацией, которую обеспечит windows при посылке сообщений окну другого потока:
SendMessage(Handle, WM_CLOSE, 0, 0);
← →
SemFLY (2003-06-28 14:52) [7]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;
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c