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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2012, 21:21   #1
IIIArtemIII
Новичок
Джуниор
 
Регистрация: 15.07.2012
Сообщений: 8
Сообщение Поток VCL компоненты

Здравствуйте у меня возникла такая проблема есть поток в потоке выполняются действия с визуальными компонентами (ПС раньше была процедура без потока вида
Procedure PR (Fam: String; Name: String; Sym:Tmemo); но при ее выполнении все наглухо зависало до завершения
так вот в потоке все работает нормально без зависаний есть но при закрытии программы вылетает ошибка недопустимый дескриптор окна (компоненты это то же окна я так понимаю) код потока

Код:
private
    { Private declarations }
  public
    { Public declarations }
  end;

  TMyThread = class(TThread)
    private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;
  MyThread: TMyThread;

procedure TMyThread.Execute;
begin
//тут как видно обращаюсь к компонентам 
memo1.text:=Fam;
listview1.items.item[0].caption:=Name;
// ну и всякое такое 
end;
вопрос как мне выполнить свою процедуру в потоке без ошибки Procedure PR (Fam: String; Name: String; Sym:Tmemo);
ей нужно 5 раз передать параметры вида

PR(‘Фамилия’, ‘Имя’, Memo1.text);

Спасибо за внимание
IIIArtemIII вне форума Ответить с цитированием
Старый 15.07.2012, 21:36   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Синхронизацию опиши в потоке.
Почитай про Synchronize. В хелпе и даже в шаблоне Thread от Делфи есть примеры.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.07.2012, 22:06   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Нельзя в потоке напрямую обращаться к VCL - это может вызвать фаталити.
Shouldercannon вне форума Ответить с цитированием
Старый 15.07.2012, 22:09   #4
IIIArtemIII
Новичок
Джуниор
 
Регистрация: 15.07.2012
Сообщений: 8
По умолчанию

ну делаю я так объявляю глобальную переменную типа Tmemo потом ей присваиваю memo1 потом пишу synchronize(Start); где START это

Код:
procedure TMyThread.START
begin
memo1.text:=FAM;
end;
в результате ошибка недопустимый дескриптор
IIIArtemIII вне форума Ответить с цитированием
Старый 15.07.2012, 22:13   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

При закрытии программ нужно все потоки завершать.
Ты когда этот поток стартуешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.07.2012, 22:13   #6
IIIArtemIII
Новичок
Джуниор
 
Регистрация: 15.07.2012
Сообщений: 8
По умолчанию

а расчет происходит в процедуре execute (в потоке) то есть в место memo1.text в потоке я пишу MyMemo.text (хотя по моему я творю бред)

стартую с таймера при открытии формы запускается таймер он запускает поток
вот код

Код:
MyThread:=TMyThread.Create(False);
MyThread.Priority:=tpHighest;
MyThread.FreeOnTerminate:=true;
Timer4.Destroy;

Последний раз редактировалось Stilet; 15.07.2012 в 22:18.
IIIArtemIII вне форума Ответить с цитированием
Старый 15.07.2012, 22:18   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
при открытии формы запускается таймер он запускает поток
Ладно. Значит в OnClose нужно проверять завершился ли этот поток, и если нет то завершать его принудительно.
Цитата:
Timer4.Destroy;
Просто из интереса расскажи что делает твой поток? Такие муки... Хотелось бы знать ради чего.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.07.2012, 22:21   #8
IIIArtemIII
Новичок
Джуниор
 
Регистрация: 15.07.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ладно. Значит в OnClose нужно проверять завершился ли этот поток, и если нет то завершать его принудительно.
Как это делать ? и разве
MyThread.FreeOnTerminate:=true; не отвечает за автоматическое завершение потока ?
IIIArtemIII вне форума Ответить с цитированием
Старый 15.07.2012, 22:32   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот легкий пример без синхронизации:
Код:
unit Unit1;

interface

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

type

TMyThread = class(TThread)
    private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var  tt:TMyThread;
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyThread }

procedure TMyThread.Execute;
begin
  inherited;
 while true do begin
  form1.Edit1.Text:=DateTimeToStr(now);
  sleep(5);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 tt:=TMyThread.Create(false);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 if not tt.Terminated then tt.Terminate;
end;

end.
Цитата:
разве MyThread.FreeOnTerminate:=true; не отвечает за автоматическое завершение потока ?
Потока да, но только того, кого описывает компонент. К главному потоку он отношение не имеет. И отвечает он не за автоматическое завершение, а за уборку мусора при завершении потока из памяти, выделенной под экземпляр компонента.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.07.2012, 22:37   #10
IIIArtemIII
Новичок
Джуниор
 
Регистрация: 15.07.2012
Сообщений: 8
По умолчанию

Stilet спасибо буду пробовать if not tt.Terminated then tt.Terminate; как я понял завершение потока ?
IIIArtemIII вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глюк VCL НЕ_АЙС Компоненты Delphi 4 03.08.2014 04:43
Класс запускает поток, который заполняет этот класс. Обмен класс <=> поток. Человек_Борща Общие вопросы Delphi 8 27.02.2012 23:24
Поток. Не получается создать поток. Выдает ошибки при запуске bigory Общие вопросы по Java, Java SE, Kotlin 3 23.09.2010 00:40
Перлы VCL Квэнди Свободное общение 7 13.02.2009 09:08
VCL Э/\bФ_}{P Свободное общение 2 21.05.2007 00:21