Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2012, 17:45   #11
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Попробуй так
Код:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
IdTCPClient1.Disconnect;
end;
Aliens_wolfs вне форума Ответить с цитированием
Старый 03.02.2012, 17:48   #12
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Попробуй так
Код:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
IdTCPClient1.Disconnect;
end;
Не помогает. Поток всёравно успевает дёрнуть IdTCPClient1
Shouldercannon вне форума Ответить с цитированием
Старый 03.02.2012, 17:54   #13
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Посмотри этот Модуль там все на потоках сделано, может кое что поможет http://zalil.ru/32636910

Еще один там и контролируется все потоки http://zalil.ru/32636934

Последний раз редактировалось Aliens_wolfs; 03.02.2012 в 17:57.
Aliens_wolfs вне форума Ответить с цитированием
Старый 03.02.2012, 17:56   #14
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Я не очень уловил логику с таймером.

Есть мнение, что делать надо так: создаёшь поток, поток создаёт TCPClient, выбирает данные, завершает работу.

Если вопрос только в разовом действии и "разморозке UI" -см. Anti-Freeze для VCL.

Если нужно что-то сложнее - используем TThread. Я же вроде уже приводил пример работы?

С TCPClient будет:
Код:
procedure TYourThread.Execute;
var
  TCPClient: TidTCPClient;
begin
  TCPClient := TidTCPClient.Create(nil);
  try
    TCPClient1.Host := '77.108.194.247';
    TCPClient1.Port := 80;
    TCPClient1.Connect(1000);
    // <- тут вся прочая работа
 
    // вернули результаты, какие надо 
  finally
    FreeAndNil(TCPClient);
  end;
end;
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 03.02.2012, 17:58   #15
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Тут кстати пример был на этом форуме от Человек_Борща сейчас найду

вот эта тема http://www.programmersforum.ru/showthread.php?t=174693 почитай проблема с потоком была

Последний раз редактировалось Aliens_wolfs; 03.02.2012 в 18:03.
Aliens_wolfs вне форума Ответить с цитированием
Старый 03.02.2012, 18:14   #16
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Задача:
Подключиться к серверу и слушать, что он пришлёт до завершения работы приложения. Прослушка должна быть обязательно в отдельном потоке, иначе форма повиснет.

Последний раз редактировалось Shouldercannon; 03.02.2012 в 18:38.
Shouldercannon вне форума Ответить с цитированием
Старый 03.02.2012, 20:28   #17
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

а чем не устраивает библиотека Synapse?
Код:
procedure TDevClientThread.Execute;
var
  i:Integer;
  LData: AnsiString;
  FSock: TTCPBlockedSocket;
begin
  try
    FSock:=TTCPBlockedSocket.Create;
    FSock.Connect('192.168.1.24','9045');
    if FSock.LastError<>0 then Exit;
    while not Terminated do
    begin

      //прием данных
      LData:=FSock.RecvBlock(1000);
      if FSock.LastError=WSAETIMEDOUT then Continue;
      if FSock.LastError<>0 then Break;

      //работаем с полученными данными LData

    end;
  finally
    FreeAndNil(FSock);
  end;
end;
Естественно, конструктор, деструктор и обработчики ошибок напишите сами. переделать под свои нужды несложно. Библиотеку можно легко прогуглить. Офф. сайт http://synapse.ararat.cz/ ИМХО, лучшая обертка винсока, легкая и стабильная.
"ковыряю изнутри" (с)

Последний раз редактировалось 3D Hunter; 03.02.2012 в 20:34.
3D Hunter вне форума Ответить с цитированием
Старый 04.02.2012, 15:40   #18
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
Сообщение

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
а чем не устраивает библиотека Synapse?
Стараюсь делать упор на стандартные средства.
Варивнт №2
Код:
...
  TMyThread = class(TThread)
    private
      { Private declarations }
      s: string;
    protected
      procedure Execute; override;
      procedure ReadFromSocket;
      procedure SyncProc;
    public
      GoMemo: TMemo;
  end;
...
var
  FormMain: TFormMain;
  MyThread: TMyThread;
...
procedure TFormMain.FormCreate(Sender: TObject);
begin
  MyThread := TMyThread.Create(True);
  MyThread.GoMemo := Memo1;
end;

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 ReadFromSocket;
end;

procedure TMyThread.ReadFromSocket;
begin 
  s := FormMain.IdTCPClient1.ReadLn; // ==> Not connected
  Synchronize(SyncProc);
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.Resume;
end;

procedure TFormMain.IdTCPClient1Disconnected(Sender: TObject);
begin
  Memo1.Lines.Add('[' + TimeToStr(Now) + ']: IdTCPClient1 отключен');

  MyThread.Suspend; // ==> THread Error: отказано в доступе (5) 
end;

end.
Изображения
Тип файла: gif EIdNotConnected.gif (14.0 Кб, 116 просмотров)
Тип файла: gif EThread.gif (15.0 Кб, 124 просмотров)

Последний раз редактировалось Shouldercannon; 04.02.2012 в 15:52.
Shouldercannon вне форума Ответить с цитированием
Старый 04.02.2012, 15:44   #19
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ИнДИ не являеться стандартным средством.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.02.2012, 18:27   #20
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Тупик. От ошибки с потоком избавился, а ошибка коннекта осталась, может, эта ошибка так и должна быть. Ткните пальцем в коде, где нужно внести поправки .
Код:
...
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;
, то всёравно возникает ошибка подключения. Словно проклятие какое-то, застрял на одном месте.

Последний раз редактировалось Shouldercannon; 04.02.2012 в 19:38.
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правельно работать с событием в потоке через форму bulldog5293 Общие вопросы Delphi 13 16.08.2011 08:48
Таймер в потоке alexprey Общие вопросы Delphi 14 11.08.2010 23:14
Создать таймер в потоке? TwiX Общие вопросы Delphi 9 23.02.2010 21:39