|
Вопрос # 5 927/ вопрос открыт / |
|
Здравствуйте, эксперты!
1. Подключиться через IdTCPClient1
2. В потоке через Timer получать данные
3. По событию формы Close остановить работу таймера и потока
При закрытии формы появляется ошибка на строке
s := FormMain.IdTCPClient1.ReadLn();
И верное ли тут построение потока?
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- ...
- TMy_Thread = class(TThread)
- private
- { Private declarations }
- s: string;
- protected
- procedure Execute; override;
- procedure SyncProc;
- public
- GoMemo: TMemo;
- end;
- ...
- procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
- begin
- Timer1.Enabled := False;
-
- if IdTCPClient1.Connected then IdTCPClient1.Disconnect;
- end;
-
- procedure TFormMain.BConnectClick(Sender: TObject);
- begin
- IdTCPClient1.Host := '77.108.194.247';
- IdTCPClient1.Port := 80;
- IdTCPClient1.Connect(1000);
-
- Timer1.Enabled := True;
- end;
-
- procedure TFormMain.Timer1Timer(Sender: TObject);
- var
- My_Thread: TMy_Thread;
- begin
- My_Thread := TMy_Thread.Create(True);
- My_Thread.FreeOnTerminate := False;
- My_Thread.GoMemo := Memo1;
- My_Thread.Resume;
- end;
-
- procedure TMy_Thread.Execute;
- begin
- if FormMain.IdTCPClient1.Connected then
- begin
- s := FormMain.IdTCPClient1.ReadLn();
- Synchronize(SyncProc);
- end;
- end;
-
- procedure TMy_Thread.SyncProc;
- begin
- GoMemo.Lines.Add('[' + TimeToStr(Now) + '] - IdTCPClient1: ' + s);
- end;
 |
Вопрос задал: Shouldercannon (статус: Посетитель)
Вопрос отправлен: 3 февраля 2012, 16:36
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 5; последнее сообщение — 4 февраля 2012, 15:49; участников в обсуждении: 3.
|
Пупкин В В (статус: 2-ой класс), 3 февраля 2012, 17:10 [#1]:
Все неправильно. Логика программы скорее всего должна быть другая. - При клике на кнопку должен запускатся поток ожидающий прихода данных с сокета и при закрытии формы все уничтожаться. таймер вообще не надо. У Вас по таймеру создаються потоки и не уничтожаються, утечка рессурсов и т.д. Если она поработает продожительное время то будет иная ошибка даж без закрытия формы.
|
|
Shouldercannon (статус: Посетитель), 3 февраля 2012, 18:34 [#2]:
Тажа ошибка
procedure TFormMain.BConnectClick(Sender: TObject);
var
My_Thread: TMy_Thread;
begin
IdTCPClient1.Host := '77.108.194.247';
IdTCPClient1.Port := 80;
IdTCPClient1.Connect(1000);
My_Thread := TMy_Thread.Create(True);
My_Thread.FreeOnTerminate := False;
My_Thread.GoMemo := Memo1;
My_Thread.Resume;
end;
procedure TMy_Thread.Execute;
begin
while not Terminated do
begin
if FormMain.IdTCPClient1.Connected then
begin
s := FormMain.IdTCPClient1.ReadLn(); // Показывает сюда
Synchronize(SyncProc);
end;
end;
end;
procedure TMy_Thread.SyncProc;
begin
GoMemo.Lines.Add('[' + TimeToStr(Now) + '] - IdTCPClient1: ' + s);
end;
|
|
bugmenot (статус: 3-ий класс), 3 февраля 2012, 19:24 [#3]:
Это не утечка памяти а прямо бахчисарайский фонтан
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
Shouldercannon (статус: Посетитель), 3 февраля 2012, 19:40 [#4]:
А если по делу. Как корректно завершить работу потока во время закрытия формы?
|
|
Shouldercannon (статус: Посетитель), 4 февраля 2012, 15:49 [#5]:
Тупик. Ошибка коннекта осталась. Может, эта ошибка так и должна быть?
...
TMyThread = class(TThread)
private
{ Private declarations }
s: string;
protected
procedure Execute; override;
procedure SyncProc;
public
GoIdTCPClient: TIdTCPClient;
GoMemo: TMemo;
end;
...
var
MyThread: TMyThread;
...
procedure TFormMain.BConnectClick(Sender: TObject);
begin
IdTCPClient1.Host := '77.108.194.247';
IdTCPClient1.Port := 80;
IdTCPClient1.Connect(1000);
end;
procedure TFormMain.BDisconnectClick(Sender: TObject);
begin
IdTCPClient1.Disconnect;
end;
procedure TMyThread.Execute;
begin
while not Terminated do
begin
if GoIdTCPClient.Connected then
begin
s := GoIdTCPClient.ReadLn;
Synchronize(SyncProc);
end;
end;
end;
procedure TMyThread.SyncProc;
begin
GoMemo.Lines.Add('[' + TimeToStr(Now) + '] - IdTCPClientMSG: ' + s);
end;
procedure TFormMain.IdTCPClient1Connected(Sender: TObject);
begin
Memo1.Lines.Add('[' + TimeToStr(Now) + ']: IdTCPClient1 подключен');
MyThread := TMyThread.Create(True); // Останавливаем поток
MyThread.GoIdTCPClient := IdTCPClient1;
MyThread.GoMemo := Memo1;
MyThread.Resume; // Запуск потока
end;
procedure TFormMain.IdTCPClient1Disconnected(Sender: TObject);
begin
Memo1.Lines.Add('[' + TimeToStr(Now) + ']: IdTCPClient1 отключен');
MyThread.FreeOnTerminate := False; // По завершению кода поток не завершится
MyThread.Terminate;
end;
По идее, после нажатия на кнопку BDisconnect произойдёт Disconnect и поток уничтожиться. если даже уничтожить поток перед
IdTCPClient1.Disconnect;
, то всёравно возникает ошибка подключения. Словно проклятие какое-то, застрял на одном месте.
|
5 февраля 2012, 18:47: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с сетями и протоколами модератором Ерёмин А.А.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|