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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2016, 18:06   #11
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от come-on Посмотреть сообщение
а зачем вообще эта s и все с ней выкрутасы? ))
В теле потока в неё записываются данные, а потом в процедуре синхронизации или DoTerminate данные обрабатываются и выводятся в ListView. Надо обратно переходить на Synchronize, с DoTerminate в данном случае много проблем
Shouldercannon вне форума Ответить с цитированием
Старый 11.09.2016, 18:20   #12
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

а поток тут реально нужен? юзверь может грохнуть окно во время работы?
come-on вне форума Ответить с цитированием
Старый 11.09.2016, 18:46   #13
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Это пример. На деле поток обращается к http для получения данных
Shouldercannon вне форума Ответить с цитированием
Старый 11.09.2016, 19:25   #14
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

ну и что, разница то какая?
come-on вне форума Ответить с цитированием
Старый 11.09.2016, 19:51   #15
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
с DoTerminate в данном случае много проблем
В DoTerminate если уж переопределил, то в нем точно такие же проблемы, как и в OnTerminate. Единственное отличие - все обращение к vcl из него нужно синхронизировать, а в OnTerminate не нужно, поскольку к нему обращение уже синхронизировано. Не зря же генокод DoTerminate выше показал. Посмотри к чему и как из него обращение идет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.09.2016, 20:40   #16
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Код:
type
  TMy_Thread = class(TThread)
  private
    { Private declarations }
    s: String;
  protected
    procedure Execute; override;
  public
    procedure MyDoTerminate(Sender: TObject);
  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.OnTerminate := My_Thread.MyDoTerminate;
  My_Thread.FreeOnTerminate := True;
  My_Thread.Start;
end;

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

procedure TMy_Thread.MyDoTerminate(Sender: TObject);
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;
Работает. Ошибок не даёт
Shouldercannon вне форума Ответить с цитированием
Старый 11.09.2016, 21:10   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Можно и так. Я бы так не делал, а вынес бы на форму обработчик для OnTerminate. Ладно, проехали. И Terminate в Execute как мертвому припарка. Почитай что этот метод делает и заодно о свойстве Terminated
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 11.09.2016 в 21:16.
Аватар вне форума Ответить с цитированием
Старый 13.09.2016, 13:58   #18
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Можно и так. Я бы так не делал, а вынес бы на форму обработчик для OnTerminate. Ладно, проехали. И Terminate в Execute как мертвому припарка. Почитай что этот метод делает и заодно о свойстве Terminated
Убрал бы Terminate с радостью, но без него не работает проверка на состояние потока после окончания. Состояние - поток работает
Код:
procedure TFormMain.BStartClick(Sender: TObject);
begin
  MyThread := TMyThread.Create(True); // После создания поток остановлен
  MyThread.FreeOnTerminate := True; // После завершения работы поток "умрёт" сам
  MyThread.Start; // Запуск потока
end;

procedure TMyThread.Execute;
var
  I2: Integer;
begin
  for I2 := 0 to 60 do
  begin
    if I2 > 61 then Break;
    Sleep(100);
    I := I2;
    Synchronize(SyncProc);
  end;

  Terminate;
end;

procedure TMyThread.SyncProc;
begin
  FormMain.Caption := IntToStr(I);
end;

procedure TFormMain.BCheckClick(Sender: TObject);
begin
  // Проверка на существование потока
  if MyThread <> nil then
  begin
    // Если поток умирает "мирно", штатно завершив работу
    if MyThread.Terminated then ShowMessage('Поток "MyThread" не работает') else ShowMessage('Поток "MyThread" работает');
  end else ShowMessage('Поток "MyThread" не создан');
end;
Shouldercannon вне форума Ответить с цитированием
Старый 13.09.2016, 14:08   #19
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
if MyThread <> nil then
А откуда в MyThread nil возмется? Уничтожение нити не означает, что в MyThread nil поместится по щучьему велению. Там так и останется указатель на убитый поток
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.09.2016, 14:11   #20
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Тогда на что проверять или как задать этот nil?
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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