powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Зависает форма при работе потока по рисовании на Image после тысяч итераций.
25 сообщений из 51, страница 1 из 3
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832800
В общем есть поток, в котором готовится и потом через Synchronize рисует изображение.
Пока учусь и тренируюсь такие вещи рисовать,потому изображение тестовое. Вроде всё хорошо рисует, обновляет и прочее, но после значительного количества итераций (много тысяч) программа зависает (not response). При том может зависнуть на 1000 итерации, а может пол часа нормально крутить и докрутить до 50000 не зависнув. Никаких сообщений о памяти, ресурсах, доступе, и прочем нет. Зависает скорее через время, нежели чем от числа повторений, если sleep поставить меньше, то и зависнет при меньшем числе итераций, но время зависания тоже разное, иногда почти сразу, иногда очень долго.

В потоке к форме не обращаюсь нигде, кроме ShowResult; (ну очень старался, вроде всё проверил)

Код приведу, сильно не бить за качество, не уверен что поможет. Хотя бы подскажите, как можно отловить причину зависания, как такие вещи в компиляторе отслеживать? Кода очень много в программе, куча обработчиков на кучи событий у кучи компонентов. Но зависает без каких-либо действий с моей стороны.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
TDravRandom = class(TThread)
  private
    { Private declarations }
    MyImage: TImage;
  protected
    procedure Execute; override;
    procedure ShowResult; //
end;


procedure TDravRandom.Execute;
var

  Iter:Integer;
  i,X,Y:Integer;
  Rr,delt,skl:Real;
  x0,y0:integer;
  share_r,ratio:real;
  r:integer;

begin

  DrawingRandom:=True;
 // while (DrawingFile=-1) and (not Terminated)  do
  MyImage:=TImage.Create(nil);
  MyImage.Width:=CoreShell.Image1.Width;
  MyImage.Height:=CoreShell.Image1.Height;
  Iter:=0;

while (DrawingFile=-1) and (not Terminated)  do
    begin

      MyImage.Width:=CoreShell.Image1.Width;
      MyImage.Height:=CoreShell.Image1.Height;

      MyImage.Canvas.Lock;

    Rr:=1e10;
    for i:=2 to InitialData.fa_location.NVig do     //для масштабирования картинки
      begin
       delt:=Sqrt(((InitialData.fa_location.TVSCord[i].x-InitialData.fa_location.TVSCord[1].x)*(InitialData.fa_location.TVSCord[i].x-InitialData.fa_location.TVSCord[1].x))+
                 ((InitialData.fa_location.TVSCord[i].y-InitialData.fa_location.TVSCord[1].y)*(InitialData.fa_location.TVSCord[i].y-InitialData.fa_location.TVSCord[1].y)));
       if delt<Rr then Rr:=delt/2;
       end;

      skl:=3700/MyImage.Height;    //масштаб
      r:=Round(1130*Rr/(skl)*0.9);       //радиус шестигранника
      ratio:=r/GlTuningImage.ReloadTuning.ratio;

       MyImage.Canvas.Pen.Color:=clBlack;
       MyImage.Canvas.Font.Size:=Round(GlTuningImage.ReloadTuning.text[1].frontsize*2*ratio);

      x0:=Round(1*(MyImage.Width)/2); //центр
      y0:=Round(1*(MyImage.Height)/2);

      Inc(iter);
      MyImage.Canvas.TextOut  (10,10,inttostr(Iter)); //вывожу итерации просто чтоб понять когда зависло

      Draw_random_core_in_thread (MyImage,x0,y0,r,Rr,skl,ratio);

MyImage.Canvas.UnLock;

    //  if CoreShell.TreeView1.Selected.Index<>0 then exit;
      Synchronize(ShowResult);
      MyImage.Picture:=nil;
      Sleep(10); //так часто чтоб быстрее зависло, иначе часами ждать можно
    end;
    
  DrawingRandom:=false;
end;

procedure TDravRandom.ShowResult;
begin
   CoreShell.Image1.Picture:=MyImage.Picture;
end;



Ну и вызываемые процедурки:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
procedure Draw_random_core_in_thread (TempImage:TImage;x0,y0,r:integer; Rr,skl,ratio:Real);
var
  i,X,Y:Integer;
  delt:Real;
//  x0,y0:integer;

 // r:integer;
begin
  for i:=1 to InitialData.fa_location.NTVS do//
    begin

       X:=Round(x0+1000*InitialData.fa_location.TVSCord[i].x/skl);
       Y:=Round(y0-1000*InitialData.fa_location.TVSCord[i].y/skl);

       TempImage.Canvas.Brush.Color:=RGB(Random(100)+150, Random(100)+150, Random(100)+150);
       DrawPolygon (r,X,Y,TempImage.Canvas);
       TempImage.Canvas.Brush.Style := bsClear;
       TempImage.Canvas.TextOut( Round(X-TempImage.Canvas.TextWidth(inttostr(i))/2+GlTuningImage.ReloadTuning.text[1].Location.X*ratio),
                                        Round(Y+GlTuningImage.ReloadTuning.text[1].Location.Y*ratio),
                                        inttostr(i));  
     end;
end;



procedure DrawPolygon (r,x0,y0:Integer;Sender: TObject);     //рисуем многоугольник радиуса Р в точке Х0У0
var
a:array[1..6] of TPoint;
i:Integer;
begin
for i:=1 to 6 do
  begin
   a[i].X:=Round(r*cos(i*2*pi/6+pi/2)+x0);
   a[i].Y:=Round(r*sin(i*2*pi/6+pi/2)+y0);
  end;
(Sender as Tcanvas).Polygon(a);
end;



...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832811
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичВ потоке к форме не обращаюсь нигде, кроме ShowResultАндрей Игоревич
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  MyImage.Width:=CoreShell.Image1.Width;
  MyImage.Height:=CoreShell.Image1.Height;
  Iter:=0;

while (DrawingFile=-1) and (not Terminated)  do
    begin

      MyImage.Width:=CoreShell.Image1.Width;
      MyImage.Height:=CoreShell.Image1.Height;


Далее, TImage - это класс VCL для отрисовки изображения. Для работы в потоке не предназначен. Вам нужен TBitmap
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832813
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про дофигища глобальных переменных я молчу
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832839
_Vasilisk_Андрей ИгоревичВ потоке к форме не обращаюсь нигде, кроме ShowResultАндрей Игоревич
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  MyImage.Width:=CoreShell.Image1.Width;
  MyImage.Height:=CoreShell.Image1.Height;
  Iter:=0;

while (DrawingFile=-1) and (not Terminated)  do
    begin

      MyImage.Width:=CoreShell.Image1.Width;
      MyImage.Height:=CoreShell.Image1.Height;


Далее, TImage - это класс VCL для отрисовки изображения. Для работы в потоке не предназначен. Вам нужен TBitmap
Но в данном случае я же просто спрашиваю размер, никак не изменяя, он мне нужен при каждой итерации (если пользователь растянул или уменьшил окно). Да и этот код я вставил уже позже, когда зависания уже были.
А чем плох запрос значения глобальной переменной без изменения её значения (далее я хотел бы рисовать куда более сложные изображения с сотнями параметров, вводить (а затем ещё и постоянно обновлять) их в поток через указатели или ещё как было бы ну очень проблемно).

TBitmap сейчас опробую, может ли быть в этом причина?
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832842
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич_Vasilisk_пропущено...
пропущено...

Далее, TImage - это класс VCL для отрисовки изображения. Для работы в потоке не предназначен. Вам нужен TBitmap
Но в данном случае я же просто спрашиваю размер, никак не изменяя, он мне нужен при каждой итерации (если пользователь растянул или уменьшил окно). Да и этот код я вставил уже позже, когда зависания уже были.
А чем плох запрос значения глобальной переменной без изменения её значения (далее я хотел бы рисовать куда более сложные изображения с сотнями параметров, вводить (а затем ещё и постоянно обновлять) их в поток через указатели или ещё как было бы ну очень проблемно).

TBitmap сейчас опробую, может ли быть в этом причина?

Не забывай про Canvas.Lock / Unlock
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832858
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичНо в данном случае я же просто спрашиваю размер, никак не изменяяЕсли слово нельзя для вас не аргумент, то почитайте Рихтера. У него очень хорошо расписана работа с разными потоками
Андрей ИгоревичА чем плох запрос значения глобальной переменной без изменения её значенияТем, что это значение внезапно может измениться
Андрей Игоревичих в поток через указателиЧитайте Рихтера
Андрей Игоревичещё как было бы ну очень проблемноБросайте вы это занятие. Программирование это одна сплошная проблема
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832871
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ни TBitmap, ни TCanvas не стоит использовать в потоках. ВСЯ отрисовка с созданием необходимых классов - должна быть в основном потоке. И нет необходимости пересоздавать на каждый чих TImage. В потоке только подготовка данных. Если уж очень хочется что-то поместить в поток - то только голый GDI или GDI+
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832879
_Vasilisk_Андрей ИгоревичНо в данном случае я же просто спрашиваю размер, никак не изменяяЕсли слово нельзя для вас не аргумент, то почитайте Рихтера. У него очень хорошо расписана работа с разными потоками
Андрей ИгоревичА чем плох запрос значения глобальной переменной без изменения её значенияТем, что это значение внезапно может измениться
Андрей Игоревичих в поток через указателиЧитайте Рихтера
Андрей Игоревичещё как было бы ну очень проблемноБросайте вы это занятие. Программирование это одна сплошная проблема
Вот вроде и ответили, а вроде и зачем это написали? К чему?
Меня устраивает изменение глобальных переменных на ходу, если я понимаю где и как это происходит. Возможно сделаю иначе. Но расчеты трехмерных полей и объектов вещь специфическая (колоссальные объемы данных и параметров) и часто я понимаю, что сделать так как обычно делают становиться невозможно ли запредельно сложно.


Вот лучше скажите, как очистить BitMap чтоб не происходило "переполнение ресурсов". Если MyImage.Picture:=nil; с этим справлялось, то, например MyBitMap.FreeImage - нет. Можно, конечно в каждом цикле создавать (Create) и освобождать(Free), что в принципе прекрасно работает - но выглядит это как-то неправильно.
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832888
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerНи TBitmap, ни TCanvas не стоит использовать в потоках.

Ну, насчёт первого ты явно погорячился. Второе - да, надо тщатильнее следить за тем откуда
оно происходит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832890
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичК чему?К тому, чтобы вы понимали, что делаете неправильно.
Андрей ИгоревичМеня устраивает изменение глобальных переменных на ходу, если я понимаю где и как это происходитНикогда не смотрел на сигналы светофора. Меня устраивает, если я просто перебегаю дорогу
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832893
white_niggerНи TBitmap, ни TCanvas не стоит использовать в потоках. ВСЯ отрисовка с созданием необходимых классов - должна быть в основном потоке. И нет необходимости пересоздавать на каждый чих TImage. В потоке только подготовка данных. Если уж очень хочется что-то поместить в поток - то только голый GDI или GDI+
А как тогда реализовать такую задачу - есть программа "оболочка", есть расчетные программы, расчетные программы каждые н-секунд сохраняют результаты расчетов на жесткий диск, данные постоянно подгружаются оболочкой (висит процесс который раз в Х-секунд сканирует ключевые папки) и будет выводить на экран результаты расчетов.
При этом чтобы все возможности оболочки по обработке данных были доступны, так время полное расчета исчисляться днями и неделями .

Пока я реализовал через поток, который подгружает данные и рисует их на нужных мне Image и кроме упомянутого зависания проблем никаких не было. Вроде через BitMap уже минут 20 крутиться и не зависло, если и не зависнет - то как бы, почем не стоит использовать? В чем потенциальная проблема? Любимого всеми Рихтера я обязательно почитаю, но чуть-чуть попозже.
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832896
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНу, насчёт первого ты явно погорячился. Второе - да, надо тщатильнее следить за тем откуда
оно происходит.Поверь, с учётом квалификации автора как программиста - лучше сразу расставить флажки. К тому-же неизвестно как этот TBitmap и его канва будут использоваться
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832901
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не взлетит.
тут программист нужен. (С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832904
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревичвисит процесс который раз в Х-секунд сканирует ключевые папкиFindFirstChangeNotification, ReadDirectoryChangesW
Андрей Игоревичтак время полное расчета исчисляться днями и неделями .А отрисовка тоже занимает недели? Загрузили расчет, за неделю рассчитали, отдали данные в главный поток - за пару секунд нарисовали
Андрей Игоревичи кроме упомянутого зависания проблем никаких не былоУдачи в перебегании дорог
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832905
_Vasilisk_Андрей ИгоревичК чему?К тому, чтобы вы понимали, что делаете неправильно.

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

_Vasilisk_Андрей ИгоревичК чему?К тому, чтобы вы понимали, что делаете неправильно.
Андрей ИгоревичМеня устраивает изменение глобальных переменных на ходу, если я понимаю где и как это происходитНикогда не смотрел на сигналы светофора. Меня устраивает, если я просто перебегаю дорогу
Если я живу городе где 3 машины, а светофоры могут гореть красным по много часов и даже дней - возможно это единственный выбор адекватно передвигаться по городу.
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832906
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerнеизвестно как этот TBitmap и его канва будут использоваться

Да это-то в общем-то известно: в потоке на нём будет что-то рисоваться, а потом отдаваться
в главный поток на отображение. Но в целом архитектура, описанная им выше, кривовата на
мой взгляд.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832910
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревичвозможно это единственный выбор адекватно передвигаться по городу.А возможно и нет. Особенно если в результате выбора есть возможность попасть на кладбище. Но, чтобы знать о всех возможностях, нужно книжки читать. А у васАндрей ИгоревичЛюбимого всеми Рихтера я обязательно почитаю, но чуть-чуть попозже.
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832915
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Так в общем случае неизвестно через чего "будет рисоваться" - хорошо если сам всё полностью можешь контролировать. И то опыт нужен. Например при разработке нашего TileControl обнаружилось, что стандартный JPEG идущий в поставке делфей нельзя использовать в потоках. Казалось бы - простая математика, процесс декодирования просится в поток. Но нашлись ситуации, правда не помню под какими версиями. Пришлось заюзать для потока декодер из системного GdiPlus
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832916
_Vasilisk_Андрей Игоревичвисит процесс который раз в Х-секунд сканирует ключевые папкиFindFirstChangeNotification, ReadDirectoryChangesW
Андрей Игоревичтак время полное расчета исчисляться днями и неделями .А отрисовка тоже занимает недели? Загрузили расчет, за неделю рассчитали, отдали данные в главный поток - за пару секунд нарисовали
Андрей Игоревичи кроме упомянутого зависания проблем никаких не былоУдачи в перебегании дорог
Со сканированием папок проблем нет, но спасибо данные варианты тоже рассмотрю.
Отрисовка занимает миллисекунды. Но отрисовывать надо каждый раз когда появились новые данные (раз в несколько секунд), рисовать после окончания расчета - это уже отдельный вопрос.
Ну от подскажите, как передать в поток, допустим, сотню разных параметров (там, как отдельные, числа, строки, булевы, массивы всего вышеупомянутого записи, куча всего и вся всех видов цветов и форм, помимо этого массивы значений на сотни тысяч элементов). При том, чтоб это не было жутко трудоемко.

В общем поток уже 40 минут крутится и обновляет картинку, пока ничего не зависло, судя по всему проблему из названия темы решить удалось путем перехода на BitMap. (но пока не уверен).
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832927
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovwhite_niggerНи TBitmap, ни TCanvas не стоит использовать в потоках.

Ну, насчёт первого ты явно погорячился. Второе - да, надо тщатильнее следить за тем откуда
оно происходит.
Что-то примитивное только, GraphUtils например совсем не потокобезопасный. Да и каждую виртуальную процу рассматривать под микроскопом то ещё удовольствие
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832951
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичНу от подскажите, как передать в поток, допустим, сотню разных параметров (там, как отдельные, числа, строки, булевы, массивы всего вышеупомянутого записи, куча всего и вся всех видов цветов и форм, помимо этого массивы значений на сотни тысяч элементов).Это очень просто.
Сделать соответствующую логику (архитектуру) у своей программы.
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39832952
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичНу от подскажите, как передать в поток, допустим, сотню разных параметровОбернуть их в одну запись. При этом не забывать о синхронизации

Простейший вариант
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
TSettings = record
  ...........
end;

TMyThread = class(TThread)
private
  FSettings: TSettings;
  FSettingsLock: TRtlCriticalSection;
private
  procedure SettingsLock;
  procedure SettingsUnLock;
  function GetSettings: TSettings;
  procedure SetSettings(const AVal: TSettings);
public
  constructor Create;
  destructor Destroy; override;
public
  property Settings: TSettings read GetSettings write SetSettings;
end;

constructor TMyThread.Create;
begin
  inherited Create(False);
  InitializeCriticalSection(FSettingsLock);
end;

destructor TMyThread.Destroy; 
begin
  DeleteCriticalSection(FSettingsLock);
  inherited Destroy;
end;

procedure TMyThread.SettingsLock;
begin
  EnterCriticalSection(FSettingsLock);
end;

procedure TMyThread.SettingsUnLock;
begin
  LeaveCriticalSection(FSettingsLock);
end;

function TMyThread.GetSettings: TSettings;
begin
  SettingsLock;
  try
    Result := FSettings;
  finally
    SettingsUnLock;
  end;
end;

procedure TMyThread.SetSettings(const AVal: TSettings);
begin
  SettingsLock;
  try
    FSettings := AVal;
  finally
    SettingsUnLock;
  end;
end;

и обращаться только к свойству Settings (к полю FSettings не обращаться никогда)
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39833272
_Vasilisk_Андрей ИгоревичНу от подскажите, как передать в поток, допустим, сотню разных параметровОбернуть их в одну запись. При этом не забывать о синхронизации

Простейший вариант
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
TSettings = record
  ...........
end;

TMyThread = class(TThread)
private
  FSettings: TSettings;
  FSettingsLock: TRtlCriticalSection;
private
  procedure SettingsLock;
  procedure SettingsUnLock;
  function GetSettings: TSettings;
  procedure SetSettings(const AVal: TSettings);
public
  constructor Create;
  destructor Destroy; override;
public
  property Settings: TSettings read GetSettings write SetSettings;
end;

constructor TMyThread.Create;
begin
  inherited Create(False);
  InitializeCriticalSection(FSettingsLock);
end;

destructor TMyThread.Destroy; 
begin
  DeleteCriticalSection(FSettingsLock);
  inherited Destroy;
end;

procedure TMyThread.SettingsLock;
begin
  EnterCriticalSection(FSettingsLock);
end;

procedure TMyThread.SettingsUnLock;
begin
  LeaveCriticalSection(FSettingsLock);
end;

function TMyThread.GetSettings: TSettings;
begin
  SettingsLock;
  try
    Result := FSettings;
  finally
    SettingsUnLock;
  end;
end;

procedure TMyThread.SetSettings(const AVal: TSettings);
begin
  SettingsLock;
  try
    FSettings := AVal;
  finally
    SettingsUnLock;
  end;
end;

и обращаться только к свойству Settings (к полю FSettings не обращаться никогда)
Спасибо, постараюсь использовать.
На тему Рихтера (книга - "Программирование под Windows"?) - будет время, почитаю, объёмное произведение. Но стоит понимать, что программирование для меня не цель, а средство решения рабочих задач.

Форма более не виснет, вопрос из заглавия темы решен.
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39833298
_Vasilisk_
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
TSettings = record
  ...........
end;

TMyThread = class(TThread)
private
  FSettings: TSettings;
  FSettingsLock: TRtlCriticalSection;
private
  procedure SettingsLock;
  procedure SettingsUnLock;
  function GetSettings: TSettings;
  procedure SetSettings(const AVal: TSettings);
public
  constructor Create;
  destructor Destroy; override;
public
  property Settings: TSettings read GetSettings write SetSettings;
end;

constructor TMyThread.Create;
begin
  inherited Create(False);
  InitializeCriticalSection(FSettingsLock);
end;

destructor TMyThread.Destroy; 
begin
  DeleteCriticalSection(FSettingsLock);
  inherited Destroy;
end;

procedure TMyThread.SettingsLock;
begin
  EnterCriticalSection(FSettingsLock);
end;

procedure TMyThread.SettingsUnLock;
begin
  LeaveCriticalSection(FSettingsLock);
end;

function TMyThread.GetSettings: TSettings;
begin
  SettingsLock;
  try
    Result := FSettings;
  finally
    SettingsUnLock;
  end;
end;

procedure TMyThread.SetSettings(const AVal: TSettings);
begin
  SettingsLock;
  try
    FSettings := AVal;
  finally
    SettingsUnLock;
  end;
end;


Хотя мне и не понятно использование property и критической секции, в чем смысл таких перестраховок? Или есть необходимость.

Для меня это выглядит как если перед каждым действием мы проверяем все переменные на существование, на форматирование, на соответствие каким нибудь условиям, заключаем всё в try exept finaly, ещё чего-нибудь для защиты, а кода внутри i+j=k;
Обычно если код не работает значит всё, хана, убиваем программу и ищем ошибку, варианты чтоб программа не умерла, но сделала часть кода не верно или не сделала вообще - обычно меня не устраивают...

Может это для ситуаций разработки программ большими группами или когда стабильность работы программы важнее результата?
...
Рейтинг: 0 / 0
Зависает форма при работе потока по рисовании на Image после тысяч итераций.
    #39833357
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичОбычно если код не работает значит всё, хана, убиваем программу и ищем ошибку, варианты чтоб программа не умерла, но сделала часть кода не верно или не сделала вообще - обычно меня не устраивают...Обычно софтина как раз работает у всех прекрасно.
НО! Данные разных юзеров хранит, как хочется ей, а не как её автору/юзверю
Также не надо зарекаться от железных аварий и стихий.
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Зависает форма при работе потока по рисовании на Image после тысяч итераций.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]