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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2015, 18:28   #11
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Но что делать, если нужно завершить поток до того, как он выполнил работу. Например, пользователь хочет закрыть программу. Поток еще работает, а списки уже уничтожены.
Sibedir вне форума Ответить с цитированием
Старый 22.02.2015, 19:22   #12
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Цитата:
Сообщение от Sibedir Посмотреть сообщение
Но что делать, если нужно завершить поток до того, как он выполнил работу. Например, пользователь хочет закрыть программу. Поток еще работает, а списки уже уничтожены.
Поставить в OnDestroy поток.Terminate; вбить гвоздь в горшок с землёй и ждать))
ДралсяСошибками вне форума Ответить с цитированием
Старый 22.02.2015, 20:04   #13
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Эээ. Не понял.
Sibedir вне форума Ответить с цитированием
Старый 22.02.2015, 20:30   #14
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Так, не?
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  Thread = class(TThread)
    protected
      procedure Execute; override;
  end;

var
  Form1: TForm1;
  T: Thread;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  T := Thread.Create(True);
  T.FreeOnTerminate := True;
  T.Resume;
end;

{ Thread }

procedure Thread.Execute;
begin
  while True do
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  T.Terminate;
end;

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

end.
ДралсяСошибками вне форума Ответить с цитированием
Старый 22.02.2015, 20:44   #15
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
T.Terminate;
То Terminate ни чего не прерывает, а только устанавливает в True свойство Terminated. Которое и нужно в цикле проверять в Execute
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.02.2015, 20:52   #16
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

Да, верно.
ДралсяСошибками вне форума Ответить с цитированием
Старый 22.02.2015, 21:52   #17
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

А теперь выполни в Execute обработку большого списка, который при закрытии программы уничтожается и получишь ошибку доступа. Ситуация усложняется, если потоков несколько.
Однозначно, перед тем как закрыть приложение и освободить память, нужно быть полностью уверенным, что все потоки завершены.
Вот я и думают, должна же быть какая-то процедура типа WaitForTerminate . Наверное здесь нужны симофоры, но логику работы с симофорами при наличии нескольких потоков я не понял.Пробовал, но работает через раз. Вот и делаю костыль с указателем. Хотя может так и нужно делать. Я так и не понял.
Но бессмысленный цикл типа
Код:
while p.out <> poEnd do Sleep(25);
перед освобождением памяти и закрытием приложение мне совсем не нравится.

Можно еще передавать потоку кусок данных физически не связанных с основными (делать ему собственную копию), но тогда много накладных расходов.

Последний раз редактировалось Sibedir; 22.02.2015 в 22:00.
Sibedir вне форума Ответить с цитированием
Старый 22.02.2015, 23:17   #18
ДралсяСошибками
Форумчанин
 
Аватар для ДралсяСошибками
 
Регистрация: 31.05.2011
Сообщений: 301
По умолчанию

хз, у меня с потоками проблем особо не было, может я конечно как-то не так их использую, но я всегда в потоке, особенно в циклах проверяю Terminated, и поток завершается по первому требованию юзера))
ДралсяСошибками вне форума Ответить с цитированием
Старый 23.02.2015, 08:31   #19
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

блин вам кластер дай на тышу ядер, вы и его на 100% положите
а алгоритмически подойти не пробовали? "сортирнуть" перед сравнением например...
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 23.02.2015, 16:16   #20
Vlad2891
Пользователь
 
Регистрация: 22.02.2015
Сообщений: 24
По умолчанию

Всем большое спасибо за советы. Чуть подразобрался. Сижу, изучаю критические секции
Vlad2891 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки. Закрываются все потоки при ошибке в одном. Son Общие вопросы Delphi 11 01.11.2013 09:32
потоки в цикле MasterSporta Общие вопросы C/C++ 2 01.10.2011 17:07
Цикл в цикле... Davlet M Помощь студентам 6 25.01.2010 01:42
Ошибка в цикле Alamez Общие вопросы Delphi 2 05.04.2009 15:12