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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2015, 09:36   #11
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

Цитата:
Конкретно в этой программе каждый поток имеет ровно 1 управляющий поток. Первый управляется Нулевым, Второй управляется Первым и т.д.
От ошибок никто (никакой код) не застрахован. Получив сбой в первом мы ПОТЕРЯЛИ управление ВСЕМИ последующими.

Цитата:
С VCL-потоком сложнее. Тут может возникнуть ситуация чтения недозаписанных данных (счётчики, переменные zx.w),
Для этого и придумали синхронизацию. (в разных ее вариациях).
Если много-много разных работают с ОДНОЙ памятью(переменными), то можно смотреть в сторону критических секций. Правда чтобы там работать очень рекомендую почитать теорию(хотя Wiki).
Вот только вопрос если ВСЮ работу с глобальными переменными потока вынести в критическую секцию(читай на время работы какого-либо потока с общими данными ОСТАНОВКА всех прочих попыток работать с ними же)
то ЧТО из кода потока останется ВНЕ этой секции если Все данные являются глобальными.

Не VCL должен читать (хотя и может) а потоки с использованием синхрометодов должны сбрасывать СВОИ результаты в ОБЩУЮ кучу данных.
А уж VCL в доступное ему время (когда потоки заняты своими делами) может заняться их обработкой.
ТАК же потоки с использованием синхрометодов(НАПИСАНЫХ тобой) могут обращаться за дополнительными данными.
очень грубая демка на тему синхропроцедур и не только
вместо "прямой" работы формой надо было бы использовать события потока.
Цитата:
это может спровоцировать попытку включения или исключения из множества чисел меньше 0 или больше 255. Ну, или может сработать "else showmessage('ERROR 77');", хотя у меня такого не происходило ни разу. Надо будет просто добавить несколько корректирующих проверок в pole_upd.
чем больше потоков, тем больше проверок связанных со слежкой друг за другом, тем выше непроизводительные траты времени потока каждого и в целом.
Тем медленнее будет выполнена исходная задача.
А если все эти проверки синхронизировать(как положено) то вообще останется в работе ОДИН проток.
А правила синхронизации придумали не просто так.
Да и все ваши флаги и проверки не что иное как попытки провести синхронизацию потоков не делая ее. Но которые пока не вполне выполняют свою задачу синхронизации.
Цитата:
Если на момент переноса puW[0]:=z0 в переменной z0 части z0.pl, z0.wp, z0.wn и z0.wc не будут соответствовать друг другу,
и тратя к тому время потоков.
Цитата:
Надо будет просто добавить несколько корректирующих проверок в pole_upd.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 23.09.2015 в 09:41.
evg_m вне форума Ответить с цитированием
Старый 24.09.2015, 06:07   #12
alcaedo
Пользователь
 
Регистрация: 05.09.2015
Сообщений: 28
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
чем больше потоков, тем больше проверок связанных со слежкой друг за другом, тем выше непроизводительные траты времени потока каждого и в целом.
Тем медленнее будет выполнена исходная задача.
Цитата:
Сообщение от evg_m Посмотреть сообщение
и тратя к тому время потоков.
Что-то я не понял, при чём тут трата времени. Процедура pole_upd выполняется ТОЛЬКО внутри VCL-потока. Выполняется по таймеру, например, раз в 1-2 секунды. В этой процедуре используются непроизводительные методы. Лишь бы код выглядел на экране небольшим и аккуратным. Скорость выполнения pole_upd не важна, в отличие от всех функций NWS, где разница между:

Код:
for fpos:=1 to 255 do
  for С:=0 to 3 do
    begin
     ...
      if (a>С) and (b>C) then ...
    end;
и

Код:
for fpos:=1 to 255 do
  begin
    ...
    if (a>0) then ...
    ...
    if (a>1) then ...
    ...
    if (a>2) then ...
    ...
    if (a>3) then ...
  end;
может сократить общее время выполнения расчётов на 30-50%
alcaedo вне форума Ответить с цитированием
Старый 24.09.2015, 09:24   #13
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

Цитата:
Что-то я не понял, при чём тут трата времени.
ВСЕ проверки ПОСТОЯННО проверяющие а не освободился ли тот другой поток, тратят ВРЕМЯ потока, на то что ему по большому счету (при правильной организации работы) совсем не нужно.

Цитата:
Процедура pole_upd выполняется ТОЛЬКО внутри VCL-потока.
А если потоки будут САМИ сообщать о своих изменениях, то и таймер покажется не нужными.
Достаточно будет указать что окно(или его часть) требует перерисовки.

Цитата:
Лишь бы код выглядел на экране небольшим и аккуратным
тогда попробуйте применить (или проверить на применимость) к вашему коду несколько правил
1. код любой процедуры целиком помещаться на экране. (не более 20-30 строк)
2. как можно МЕНЬШЕ ГЛОБАЛЬНЫХ переменных.
3. для каждого класса ОТДЕЛЬНЫЙ модуль (unit)
4. если основная задача какой-либо процедуры работа с показом формы, то это должен быть метод ЭТОЙ формы. (и в ней не должно быть привязки к глобальному объекту данной формы.
Код:
//применительно к pole_upd п.4 выглядит так
procedure TForm4.pole_upd;// это метод формы(с соответствующим объявлением в классе TForm4  )
begin 
  form4.//   ТАКОГО здесь быть не должно
....
end;
Цитата:
в отличие от всех функций NWS, где разница между:
Цитата:
может сократить общее время выполнения расчётов на 30-50%
а на сколько сократит это время отказ от
Цитата:
if zXX.flr then ....
else ...
Цитата:
while isRunning and zXX do Sleep();
вот что я называю непроизводительными тратами.
Да, я прекрасно понимаю, что вам эти траты пока что кажутся НЕОБХОДИМЫМИ.
Именно в силу вашего принципа организации работ. каждый следит за кем-то и управляет им.
А чтобы следить надо его проверять (отсюда if )
и если работы пока нет, то потом она появится (отсюда while sleep)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 24.09.2015, 22:56   #14
alcaedo
Пользователь
 
Регистрация: 05.09.2015
Сообщений: 28
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
4. если основная задача какой-либо процедуры работа с показом формы, то это должен быть метод ЭТОЙ формы. (и в ней не должно быть привязки к глобальному объекту данной формы.
Код:
//применительно к pole_upd п.4 выглядит так
procedure TForm4.pole_upd;// это метод формы(с соответствующим объявлением в классе TForm4  )
begin 
  form4.//   ТАКОГО здесь быть не должно
....
end;
Ок. В этом есть смысл. Кстати, все функции NWS уже сделал методами соответствующих потоков
Код:
TMyWorkerThread0 = class(TThread)
  protected
    procedure Execute; override;
    Procedure MyA;
    function NWS3:boolean;
    function NWS2:boolean;
end;
MyA - процедура проверки текущего состояния на повтор. Вызывается через Synchronize из NSW2 (или NWS3), по окончании работы выставляет или сбрасывает флаг, который читает NSW2 (или NWS3).

Код:
procedure TMyWorkerThread0.MyA;
  begin
    with z0 do PoleProcessed:=MyProcessed(w.wc,w.pl)
  end;
MyProcessed - собственно функция проверки текущего состояния на повтор. Вроде работает, но нужно ещё потестировать. Результат на небольших начальных данных впечатляет. Был у меня начальный набор из 17 фишек, который не имел решения, а программа выдавала результат "решений нет" за 32-56 секунд в зависимости от настроек. Так вот, с отсевом через MyA результат получается за 3 секунды!

А что значит "и в ней не должно быть привязки к глобальному объекту данной формы"?
alcaedo вне форума Ответить с цитированием
Старый 25.09.2015, 09:56   #15
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

Цитата:
А что значит "и в ней не должно быть привязки к глобальному объекту данной формы"?
Цитата:
//применительно к pole_upd п.4 выглядит так
procedure TForm4.pole_upd;// это метод формы(с соответствующим объявлением в классе TForm4 )
begin
form4.// ТАКОГО здесь быть не должно
подробно о глобальных переменных.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
W1050 WideChar reduced to byte char in set expressions. Человек_Борща Общие вопросы Delphi 8 19.06.2012 20:57
Ошибки в программе - функция для работы с множествами X-REY Паскаль, Turbo Pascal, PascalABC.NET 4 26.10.2011 20:48
Оптимизация методов работы с БД Lindemann66 C/C++ Базы данных 1 11.10.2011 13:06
W1050 WideChar reduced to byte char in set expressions. Что делать? SkAndrew Общие вопросы Delphi 3 01.11.2008 07:51
Модуль для работы с множествами [Pascal] iFool Помощь студентам 2 20.10.2008 22:04