Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.04;
Скачать: CL | DM;

Вниз

Почему не работает ? (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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.018 c
8-10841
nevalex
2003-05-08 09:17
2003.09.04
Как нарисавать функцию


1-10753
Юлия
2003-08-25 07:30
2003.09.04
Переименование TreeNode


6-10855
comintegrator
2003-06-29 02:33
2003.09.04
ARP RARP


1-10792
otido
2003-08-21 18:12
2003.09.04
CAPI и перехват входящего звонка


7-10991
SergeyI
2003-06-21 12:24
2003.09.04
работа с реестром