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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2010, 22:28   #1
casper0094
Пользователь
 
Регистрация: 19.03.2010
Сообщений: 31
Лампочка Зависание программы с потоком

При работе с indy, шваез в потоке, приложение начинает виснуть.
Сам поток :
Код:
unit Unit2;

interface

uses
  Classes,  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdExplicitTLSClientServerBase, IdFTP, Forms,ComCtrls,Windows,StdCtrls,IdAntiFreezeBase,
  IdAntiFreeze;

type
  MyThread = class(TThread)
  private
  procedure IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
    { Private declarations }
  public
    file1 : string;
  protected
    procedure Execute; override;
  end;

implementation
var
   ProgressBar1: TProgressBar;
   size : int64;
{
  Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure MyThread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end;

    or

    Synchronize(
      procedure
      begin
        Form1.Caption := 'Updated in thread via an anonymous method'
      end
      )
    );

  where an anonymous method is passed.

  Similarly, the developer can call the Queue method with similar parameters as
  above, instead passing another TThread class as the first parameter, putting
  the calling thread in a queue with the other thread.

}

{ MyThread }

procedure MyThread.IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
ProgressBar1.Position := aWorkCount div (size div 100);
end;

procedure MyThread.Execute;
var
  Form : Tform;
  IdFTP1: TIdFTP;
  IdAntiFreeze1: TIdAntiFreeze;
begin
  Form := Tform.Create(Application);
  Form.Show;
  IdAntiFreeze1 := TIdAntiFreeze.Create(application);
  ProgressBar1 := TProgressBar.Create(Application);
  ProgressBar1.Parent := Form;
  IdFTP1 := Tidftp.Create(application);

  IdFtp1.Host := 'localhost';
  IdFtp1.Username := 'a';
  IdFtp1.Password := 'a';
  IdFtp1.Connect;
  idftp1.OnWork := IdFTP1Work;

  Size := IdFtp1.Size(file1);
  idftp1.Get(File1,'D:\1.txt',true);

  Form.Close;
  Form.Free;
  IdFtp1.Free;
  { Place thread code here }
end;

Как вызываю из приложения :
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 T1 : MyThread;
begin
  T1 := MyThread.Create(true);
  T1.FreeOnTerminate:=true;
  T1.Priority:=tpLower;
  if FileList = 1 then
    T1.file1 := File1.Items.Item[File1.ItemIndex].Caption;
  if FileList = 2 then
    T1.file1 := dir2 + '\'+ File2.Items.Item[File2.ItemIndex].Caption;
  T1.Resume;
end;
end.
casper0094 вне форума Ответить с цитированием
Старый 25.08.2010, 22:32   #2
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Тут вообще все неправильно, читаем внимательно про потоки, про синхронизацию и в частности про работу из потока с VCL

кстати, у тебя самого в программе написано:
Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize,

Последний раз редактировалось artemavd; 26.08.2010 в 03:23.
_Engine_ вне форума Ответить с цитированием
Старый 25.08.2010, 22:36   #3
casper0094
Пользователь
 
Регистрация: 19.03.2010
Сообщений: 31
По умолчанию

Но оно же всё работате, прогресс бегает. Вот только когда закачка идёт то немогу двигать ни поточную форму ни главную.
casper0094 вне форума Ответить с цитированием
Старый 25.08.2010, 22:41   #4
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Вот книга о потоках, почитай - полезно будет.
_Engine_ вне форума Ответить с цитированием
Старый 25.08.2010, 22:49   #5
casper0094
Пользователь
 
Регистрация: 19.03.2010
Сообщений: 31
По умолчанию

Спасибо))) Всё сделал)) просто я думал что Synchronize используется только с vcl из других юнитов, а тут я создавал диамически, вот это то и ввело меня в заблуждение.
Сделал так:
Код:
unit Unit2;

interface

uses
  Classes,  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdExplicitTLSClientServerBase, IdFTP, Forms,ComCtrls,Windows,StdCtrls,IdAntiFreezeBase,
  IdAntiFreeze;

type
  MyThread = class(TThread)
  private
  procedure IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
    { Private declarations }
  public
    file1 : string;
  protected
    procedure Execute; override;
  end;

implementation
var
  Form : Tform;
   ProgressBar1: TProgressBar;
   size : int64;
{
  Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure MyThread.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end;

    or

    Synchronize(
      procedure
      begin
        Form1.Caption := 'Updated in thread via an anonymous method'
      end
      )
    );

  where an anonymous method is passed.

  Similarly, the developer can call the Queue method with similar parameters as
  above, instead passing another TThread class as the first parameter, putting
  the calling thread in a queue with the other thread.

}

{ MyThread }

procedure MyThread.IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Int64);
begin
Synchronize(
      procedure
      begin
ProgressBar1.Position := aWorkCount div (size div 100);
      end
      );
end;

procedure MyThread.Execute;
var
  IdFTP1: TIdFTP;
  IdAntiFreeze1: TIdAntiFreeze;
begin
Synchronize(
  procedure
  begin
    Form := Tform.Create(Application);
    Form.Show;
  end);

  IdAntiFreeze1 := TIdAntiFreeze.Create(application);
Synchronize(
  procedure
  begin
  ProgressBar1 := TProgressBar.Create(Application);
  ProgressBar1.Parent := Form;
  end);
  IdFTP1 := Tidftp.Create(application);

  IdFtp1.Host := 'localhost';
  IdFtp1.Username := 'a';
  IdFtp1.Password := 'a';
  IdFtp1.Connect;
  idftp1.OnWork := IdFTP1Work;

  Size := IdFtp1.Size(file1);
  idftp1.Get(File1,'D:\1.txt',true);
Synchronize(
  procedure
  begin
  Form.Close;
  Form.Free;
    end);
  IdFtp1.Free;
  { Place thread code here }
end;


end.
casper0094 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависание программы при попытки получения сообщения. Lokos Работа с сетью в Delphi 8 28.08.2010 12:29
Зависание программы. kardinal94 Общие вопросы Delphi 2 23.08.2010 17:36
Зависание программы при выполнении GET запроса iHikita Общие вопросы .NET 1 16.07.2010 00:20
CriticalSection -> зависание программы PUH Помощь студентам 1 05.11.2009 13:19
"Зависание" программы. no. Общие вопросы Delphi 2 19.02.2007 08:44