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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2007, 07:18   #1
Arteom
Пользователь
 
Регистрация: 22.08.2007
Сообщений: 59
По умолчанию Создание события потока

Доброго времени суток!
У меня есть фун-ция, которая выполняет поиск файлов и добавляет найденные в StringGrid.
Если маска для поиска, например, C:\ или D:\ то фун-ция будет отрабатывать довольно долго. Хочу сделать так, чтобы во время работы фун-ции появлялась форма, на которой был бы Animate.Active = true и после завершения функции форма закрывалась и появлялся уже заполненный StringGrid.
Пытаюсь сделать выполнение моей фун-ции в потоке, то есть когда появляется форма с Animate и Animate.Active = true, фун-ции выполняется в потоке.
Проблема в том, что я практически не знаком с потоками и пока не могу разобраться. Подскажите пожалуйста, как мне сделать выполнение функции в событии потока? И как поступить с функцией? Она написана не удачно и привязана к StringGrid, а поток ведь должен быть полностью не зависим от компонент.
Заранее спасибо.
Arteom вне форума Ответить с цитированием
Старый 27.12.2007, 06:31   #2
Jeni
Форумчанин
 
Регистрация: 31.05.2007
Сообщений: 486
По умолчанию

Цитата:
Сообщение от Arteom Посмотреть сообщение
Если маска для поиска, например, C:\ или D:\ ...
Вообще-то, это не маска, а указание пути поиска, хотя я может не так понял.

Цитата:
Сообщение от Arteom Посмотреть сообщение
Проблема в том, что я практически не знаком с потоками и пока не могу разобраться. Подскажите пожалуйста, как мне сделать выполнение функции в событии потока? И как поступить с функцией? Она написана не удачно и привязана к StringGrid, а поток ведь должен быть полностью не зависим от компонент.
Скорее компоненты не должны быть зависимы от потоков, но это лирика
Чтобы потоки нормально работали с разными элементами, значения элементов нужно менять не в методе Execute, а вызывать из Execute процедуру Synchronize и уже в ней менять разные свойства/переменные и т.д. Но скорость работы при этом падает.
Если в StringGrid "лезет" только один поток, то никаких проблем не будет и без Synchronize. Проблемы начнутся только если сразу несколько потоков будут работать с таблицей. В принципе, поток может сохранять имена файлов внутри себя и заполнять StringGrid после окончания работы.
Jeni вне форума Ответить с цитированием
Старый 27.12.2007, 08:45   #3
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

проблемы все ранво могут начаться, так как все события StringGrid-а буду т обрабатываться VCL-потоком
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 28.12.2007, 00:00   #4
Arteom
Пользователь
 
Регистрация: 22.08.2007
Сообщений: 59
По умолчанию

То что все действия с визуальными компонентами нужно описывать в Synchronize - это я понял, спасибо. а как реализовать событие потока?
Я попытался, но не хватает практики в подобных вещах, и ничего не получается.
Arteom вне форума Ответить с цитированием
Старый 28.12.2007, 10:40   #5
Domovoy
Форумчанин
 
Регистрация: 24.10.2007
Сообщений: 254
По умолчанию

Создаш проект, кинеш две кнопки, лэйбел, едит, в модуль вставишь этот код и го
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMyTHRead = class (TThread)// Вот поточек :)
  private
  index:integer;
  procedure EditLabel;
  protected
  procedure execute;override;
  end;

  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    THR:TMyTHRead;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
   THR:= TMyTHRead.Create(true);
end;

{ TMyTHRead }

procedure TMyTHRead.EditLabel;
begin
  Form1.Label1.Caption:=IntToStr(index);
end;

procedure TMyTHRead.execute;
begin
  index:=0;
  while true do
  begin
  Synchronize(EditLabel);
  inc(index);
  if Terminated then
    exit;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  THR:=TMyTHRead.Create(true);
  THR.Priority:=tpLower;
  THR.Resume;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  THR.Terminate;
end;

end.
Domovoy вне форума Ответить с цитированием
Старый 28.12.2007, 22:47   #6
Arteom
Пользователь
 
Регистрация: 22.08.2007
Сообщений: 59
По умолчанию

Спасибо конечно, но это я в курсе, об этом во всех книгах пишут.
Меня интересует как конкретно работать с событиями потоков, как их объявлять и использовать.
Arteom вне форума Ответить с цитированием
Старый 29.12.2007, 11:21   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

в public описываете процедуры типа procedure DoMy; потом их вызываете с помощью синхронизации в execute. В чем еще проблема то ? Вам подобное описали выше. Наверное Вы имеете ввиду обрабатывать события - если да то вот пример на быструю руку

Код:
type
  Thread = class(TThread)
  private
    FOnProcess: TNotifyEvent;
    procedure DoProcess;
    ...
  published
    OnProcess: TNotifyEvent read FOnProcess write FOnProcess;
  end;
  
...

procedure Thread.Execute;
begin
...
Synchronize(DoProcess);   
...
end;

procedure Thread.DoProcess;
begin
  if Assigned(FOnProcess) then
   FOnProcess(Self);
end;

...

var
  thr: Thread;

...

begin
  thr.OnProcess := Ваша обработка;
end;
BOBAH13 вне форума Ответить с цитированием
Старый 09.01.2008, 23:36   #8
Arteom
Пользователь
 
Регистрация: 22.08.2007
Сообщений: 59
По умолчанию

Извините что не долго не отписывался на свою же тему. Уезжал на праздники
Делаю всё как вы посоветовали, но ничего не происходит. Такое впечатление, что поток не выполняется, хотя вроде должен.
Делаю:
potok := TSimpleThread.Create(true);
potok.OnSimPath := SimPath;
potok.Resume;

SimPath объявлена в привате основной формы как procedure SimPath(Sender: Tobject; const str1, str2: String; fl: integer) и реализована так:
procedure TMainForm.SimPath(Sender: Tobject; const FilePath, LinkPath: String; fl: integer);
begin
MainForm.StringGrid1.Cols[0].Add(str1);
MainForm.StringGrid1.Cols[1].Add(str2);
MainForm.StringGrid1.Cols[3].Add(str1);
end;

Подскажите пожалуйста, тут нет ошибок?
Arteom вне форума Ответить с цитированием
Старый 10.01.2008, 08:48   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Совершенно верно тут ошибок и не будет. Только в поток Вы не сделали следующее

type
tpotok = class(TThread)
private
procedure dosimpath;
public
procedure execute; override;
...
onsimpatch: ...
end;

...

procedure tpotok.onsimpatch;
begin
if assigned(onsimpatch) then
onsimpatch(...);
end;

procedure tpotok.execute;
begin
...
Synchronize(DoProcess);
...
end;
BOBAH13 вне форума Ответить с цитированием
Старый 11.01.2008, 21:16   #10
Arteom
Пользователь
 
Регистрация: 22.08.2007
Сообщений: 59
По умолчанию

Это я реализовал, просто не стал писать. Похоже что проблема свелась к передаче параметров функции Func1(str1, str2: string; fl: integer), которая у меня выполняется в Execute.
По крайней мере я думаю, что проблема именно в этом. Подскажите, как правильно это реализовать. Я пытался, но ничего не получается.
Func1 у меня выполняется в потоке, она ищет файлы и в зависимости от значения fl добавляет строки в StringGrid. В предыдущем сообщении я писал как я пытался это сделать, но у меня ничего не получается.
Без потоков работает всё как надо, а в потоке ничего не получается.
Arteom вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
События для DBGrid Максим_Леонидович Компоненты Delphi 1 08.08.2008 22:43
Создание события формы, доступного в Disign-time Fausto Компоненты Delphi 4 06.06.2008 16:12
Распараллеливание потока eXa Общие вопросы Delphi 3 19.07.2007 20:11