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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2016, 22:09   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Что нельзя делать в DoTerminate

Начну с вопроса. DoTerminate это метод события OnTerminate?
Есть
Код:
unit Unit2;

interface

uses
...

type
  TForm2 = class(TForm)
    ListView1: TListView;
    PFooter: TPanel;
    PBBRefresh: TPngBitBtn;
    procedure PBBRefreshClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TMy_Thread = class(TThread)
  private
    { Private declarations }
    s: String;
  protected
    procedure Execute; override;
    procedure DoTerminate; override;
  public
  end;

var
  Form2: TForm2;
  My_Thread: TMy_Thread;

implementation

uses Utils;

{$R *.dfm}

procedure TForm2.PBBRefreshClick(Sender: TObject);
begin
  My_Thread := TMy_Thread.Create(True);
  My_Thread.FreeOnTerminate := True;
  My_Thread.Start;
end;

procedure TMy_Thread.Execute;
begin
  s := '1;2;3;4;5;';
  Terminate;
end;

procedure TMy_Thread.DoTerminate;
var
  Item: TListItem;
begin
  Form2.ListView1.SortType := stNone;
  Form2.ListView1.Items.BeginUpdate;
  Form2.ListView1.Items.Clear;

  while Pos(';', s) <> 0 do
  begin
    Item := Form2.ListView1.Items.Add;
    Item.Caption := Copy(s, 1, Pos(';', s) - 1);
    Delete(s, 1, Pos(';', s));
  end;

  Form2.ListView1.SortType := stBoth;
  Form2.ListView1.Items.EndUpdate;

  ShowForm(Form2);
end;

end.
и
Код:
unit Utils;

interface

uses
  Winapi.Windows, Vcl.Forms;

procedure ShowForm(Form: TForm);

implementation

procedure ShowForm(Form: TForm);
begin
  if Form.WindowState = wsNormal then
  begin
    Form.WindowState := wsNormal;
    Form.Show;
  end;
  if Form.WindowState = wsMinimized then
  begin
    ShowWindow(Form.Handle, SW_RESTORE);
    Form.Show;
  end;
  if Form.WindowState = wsMaximized then
  begin
    ShowWindow(Form.Handle, SW_MAXIMIZE);
    Form.Show;
  end;
end;

end.
из Form1 делаю
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.PBBRefresh.OnClick(Self);
end;
В лучшем случае на Form2 не будет ни одного контрола в худшем - ошибки. При закрытии всего проекта - Недопустимый дескриптор.
Эксперименты показали, что из-за
Код:
ShowForm(Form2);
происходит окирпичивание.

Возникает вопрос, что нельзя делать в Doterminate для избежания других ошибок.
Изображения
Тип файла: png Безымянный.png (4.8 Кб, 91 просмотров)
Shouldercannon вне форума Ответить с цитированием
Старый 10.09.2016, 22:13   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

в контексте какого потока выполняется DoTerminate ?
come-on вне форума Ответить с цитированием
Старый 10.09.2016, 22:27   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Синхронизацию нужно делать как обычно для vcl. Посмотри что в генокоде
Код:
procedure TThread.DoTerminate;
begin
  if Assigned(FOnTerminate) then Synchronize(CallOnTerminate);
end;
Он вызывается перед концом нити, но она еще живая. И чего замещать его?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 10.09.2016 в 22:34.
Аватар вне форума Ответить с цитированием
Старый 10.09.2016, 22:30   #4
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
DoTerminate это метод события OnTerminate?
что значит метод? )) если имеете ввиду что обработчик то нет, об этом в справке писано, это запускатель обработчика
come-on вне форума Ответить с цитированием
Старый 11.09.2016, 10:12   #5
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Можно ли в DoTerminate обращаться к VCL формы?
Код:
Form2.ListView1.SortType := stNone;
  Form2.ListView1.Items.BeginUpdate;
  Form2.ListView1.Items.Clear;

  while Pos(';', s) <> 0 do
  begin
    Item := Form2.ListView1.Items.Add;
    Item.Caption := Copy(s, 1, Pos(';', s) - 1);
    Delete(s, 1, Pos(';', s));
  end;

  Form2.ListView1.SortType := stBoth;
  Form2.ListView1.Items.EndUpdate;
Или это лучше делать через Synchronize?
Shouldercannon вне форума Ответить с цитированием
Старый 11.09.2016, 10:18   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Предыдущие сообщения не читали?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.09.2016, 10:33   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Объяви в private формы Form2 метод
Код:
procedure MyTerminate(Sender: TObject);
при создании нити
Код:
My_Thread := TMy_Thread.Create(True);
My_Thread.OnTerminate:=MyTerminate;
...
В implementation формы
Код:
procedure TForm2.MyTerminate(Sender: TObject);
begin
...здесь что хош c vcl, будет вызываться из нити синхронизированно
end;
И ни каких замен метода DoTerminate
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.09.2016, 15:55   #8
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Объяви в private формы Form2 метод
Процедура не видит переменную поля потока - s

Цитата:
Сообщение от Аватар Посмотреть сообщение
И ни каких замен метода DoTerminate
Хм. Про замену DoTerminate я не ничего не писал.
Shouldercannon вне форума Ответить с цитированием
Старый 11.09.2016, 16:18   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Хм. Про замену DoTerminate я не ничего не писал.
А это кто написал?
Код:
procedure DoTerminate; override;
Цитата:
Процедура не видит переменную поля потока - s
сделай свойством нити и читай его в OnTerminate. Sender и будет экземпляром TMy_Thread
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.09.2016, 17:16   #10
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

а зачем вообще эта s и все с ней выкрутасы? ))
come-on вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
если в секцию .code нельзя писать. самому процессу можно это делать? goluzov Win Api 6 02.08.2012 10:32
Что мне делать или что надо знать перед тем как начать изучение яз.программирования С/С++? nokian8 Свободное общение 19 25.06.2012 23:09
Почему виртуальные методы и деструкторы нельзя делать шаблонными??? mike_tihomirov Общие вопросы C/C++ 3 14.12.2010 15:03
Что нужно сделать, чтобы в настройках браузеров нельзя было отключить всплывающие окна bob111 Операционные системы общие вопросы 7 19.06.2009 08:40