Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему не работает ? (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]

Подскажите... ;)


Наверх

Титульная страница Поиск, карта сайта Написать письмо