Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
1-10725
MetalFan
2003-08-19 15:39
2003.09.04
Нарисовать стрелки...


1-10666
saska
2003-08-25 11:32
2003.09.04
Баг дебагера?


1-10784
snake1977
2003-08-25 13:18
2003.09.04
компонент


7-11012
AdMiRaL
2003-06-22 20:54
2003.09.04
Faili


3-10635
stud
2003-08-15 11:17
2003.09.04
транзакции при использовании визуальных компанентов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский