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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2010, 12:01   #1
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию проблема с TThreads

собственно задача такая: нужно сделать копирование файла в отдельном потоке чтоб пока шло копирование можно было работать с главной формой.

на форме 1 кнопка и 1 прогресс бар, делал так:
Код:
//------копирование файла

procedure TMainFrm.CopyFile(Source, Destination: string);
var
FromF, ToF: file of byte;
  Buffer: array[0..4096] of char;
  NumRead: integer;
  FileLength: longint;

begin

  AssignFile(FromF, Source);
  reset(FromF);
  AssignFile(ToF, Destination);
  rewrite(ToF);
  FileLength := FileSize(FromF);
  with ProgressBar1 do
  begin
    Min := 0; 
    Max := FileLength; 
    while FileLength > 0 do 
    begin
      BlockRead(FromF, Buffer[0], SizeOf(Buffer), NumRead);
      FileLength := FileLength - NumRead;
      BlockWrite(ToF, Buffer[0], NumRead); 
      Position := Position + NumRead; 
    end; 
    CloseFile(FromF); 
    CloseFile(ToF); 
  end;
end;
//--------------
procedure TMainFrm.RunThreadCop;
begin
CopyFile('c:\3\123.exe', 'd:\1\123.exe');
end;
//--------
procedure TMainFrm.Button1Click(Sender: TObject);
var
T1: TThreadCop;

begin
T1:= TThreadCop.Create(true);
T1.Priority:=tpNormal;
T1.Resume;
end;
создал модуль для потока (file->new->other ... ) и синхронизировал его

Код:
procedure TThreadCop.Execute;
begin
  { Place thread code here }
  Synchronize(MainFrm.RunThreadCop);
end;
НО... копировать - копирует и прогресс бар работает, но копирует не в отдельном потоке а как будто в том же что и главная форма. в чем ошибка ? почему копирование не происходит в отдельном потоке ?
wm_leviathan вне форума Ответить с цитированием
Старый 15.10.2010, 12:12   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Код:
procedure TThreadCop.Execute;
begin
  { Place thread code here }
  Synchronize(MainFrm.RunThreadCop);
end;
прочитай в справке про Synchronize или набери в поиске по форуму и почитай ветки.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 15.10.2010, 12:44   #3
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию

да читал про этот метод

странно что это работает на ура:
Код:
//рисование значков † на PaintBox
procedure TForm1.gtextout(CNV: TCanvas);
begin
  CNV.Font.Size:=6;
  CNV.Font.Name:='COmicSansMs';
  CNV.Font.Color:=clRed;
  CNV.TextOut(random(300),random(300),'†');
end;
//-----------
procedure TForm1.OutD1;
begin
gTextOut(PaintBox1.Canvas);
end;
//-------
procedure TForm1.Button1Click(Sender: TObject);
var T1 : TMyThread;   	
begin
T1:= TmyThread.Create(true); 
T1.Priority:=tpNormal;		
T1.Resume;
end;
//------модуль TMyThreads с синхр.
procedure TMyThread.Execute;
begin
  while not Terminated do
   Synchronize(Form1.OUTD1)
end;
разницы никакой с 1м примером этот рисует значки "†" на PaintBox а мне надо копировать файл с ProgressBar'ом.
в чем траблы что то не пойму
wm_leviathan вне форума Ответить с цитированием
Старый 15.10.2010, 13:00   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
да читал про этот метод
И что вы читали (знаете) про данный метод?

Написано в справке
Цитата:
Execution of the thread current is suspended while Method executes in the main thread.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 15.10.2010, 15:30   #5
wm_leviathan
Форумчанин
 
Аватар для wm_leviathan
 
Регистрация: 17.02.2010
Сообщений: 399
По умолчанию

ну скажем я читал в хелпаке описание методов synchronize.
проблему решил иначе: функцию копирования вызывать и описывать в модуле Threads а не в главном модуле программы. сам же вызов функции сам же вызов происходит в execute
Код:
procedure TThreadCopy.Execute;
begin
CopyFile('c:\3\123.exe', 'd:\1\123.exe');
end;
а по нажатию кнопки делать так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
TThreadCopy.Create(False);
end;
будем считать что тема закрыта.
wm_leviathan вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37