![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 | |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
![]() Цитата:
При том, что я выбрал вывод инфы именно в лейбы. И на интерфейсе мне больше пока ничего не надо.
Подпись ? Не, не слышал ...
Последний раз редактировалось OmegaBerkut; 01.03.2017 в 17:09. |
|
![]() |
![]() |
![]() |
#12 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,542
|
![]() Цитата:
так вот задача поставленная тобой в нашем понимании КАК я могу синхронно заполнять набор визуальных объектов если изменения происходят НЕ одновременно. наше решение. НАКАПЛИВАТЬ изменения в некоем буфере (переменных НЕ ИМЕЮЩИХ визуализации) и выводить их блоком (делать синхронный вывод).
программа — запись алгоритма на языке понятном транслятору
|
|
![]() |
![]() |
![]() |
#13 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
![]()
В этом то и проблема ... Я хочу избежать такой ситуации, в которой чем больше блок - тем дольше вывод.
Подпись ? Не, не слышал ...
|
![]() |
![]() |
![]() |
#14 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,542
|
![]() Цитата:
или же ... отсчет идет по МИНУТАМ и случаются простои в изменяемом времени. ЗАДАЧА. Уменьшить объем обновляемой формой информации. НЕ обновлять данные если они действительно не изменялись. т.е. форма во время СВОЕГО вывода должна проверять наличие изменений. 1. Рядом с переменной времени ожидания делаем ЕЩЕ ОДНУ переменную флаг изменения и поток устанавливает его(для каждого потока свой, также как и время) ОДНОВРЕМЕННО с изменением времени. А форма во время своего вывода проверяет данные флагИ и меняет/не трогает label. ПОСЛЕ этого сбрасывает данный флаг. 2. флаг совмещенный со временем. поток записывает время в переменную. форма выводит значение и "сбрасывает" его в 0 (к примеру). при следующей итерации вывода НЕЗАВИСИМОЙ от потока форма ПРОВЕРЯЕТ время и если оно есть (отличное от "сброшенного значения" ) выводит (обновляет label) и выполняет "сброс", в противном случае все остается по прежнему. 3. делаем еще один блок(массив) времен которым будет пользоваться исключительно форма. при выводе КОПИРУЕМ туда выводимое время. а при следующем выводе ПРОВЕРЯЕМ совпадение => данные не были изменены и вывод не нужен или НЕсовпали =>данные изменились и неплохо было бы вывести, а потом и скопировать.
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 01.03.2017 в 17:45. |
|
![]() |
![]() |
![]() |
#15 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
![]()
evg_m, хорошо, флаг вывода - тоже полезная вещь ...
И всё таки ... Как организовать синхронизацию внутри потоков ? Это уже вопрос личного интереса. upd: вот такой вот синхронизатор в целом работает: Код:
Подпись ? Не, не слышал ...
Последний раз редактировалось OmegaBerkut; 01.03.2017 в 18:26. |
![]() |
![]() |
![]() |
#16 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
![]()
В качестве флага вывода можно использовать null. Без дополнительной переменной ... Ну и в качестве буфера вывода строка ...
upd: в итоге, полученная реализация оказалась сильно завязана на то, что происходит на форме. Здесь же мне рассказывали, что это неправильно. До этого у меня на форме выполнялось только управление задачами (они же потоки). Теперь ещё и таймер, который раз в 100 мс выполняет обновление инфы. Зато, потоки синхронизированы, но не между собой (как я изначально хотел), а с формой - ждут, пока форма заберёт данные. upd 2: и всё равно нужно синхронизировать потоки между собой; потому что как только большой поток вернулся после выполнения опять на таймаут - вывод происходит независимо от соседних потоков; пересчёт показывает разницу в пол секунды, хотя форма вроде как бы обновляется раз в 100 мс: за один тик таймера обновляются только те компоненты, которые нуждаются в обновлении, даже если обновлять все - это ничего не меняет; потоки вычисляют время, и делают задержку 1 секунду; за эту секунду форма успевает проверить все потоки 10 раз; первый выбившийся поток за пределы первых 100 мс будет обновлён в последующие 100 мс, в которых этот поток выложил данные для обновления - именно в этом месте видны результаты асинхрона. Вы писали, что форма должна обновлять данные не 10, а 25 раз в секунду; собственно, это так же ничего не меняет в лучшую сторону, а только дополнительно грузит процессор. Сегментацию времени вывода нужно не увеличивать, а уменьшать, что изначально неправильно, так как в итоге окажется, что надо синхронизировать потоки НЕ только между собой, но и с формой дополнительно. Что уже можно назвать "дурной работой". Какие ещё будут предложения ?
Подпись ? Не, не слышал ...
Последний раз редактировалось OmegaBerkut; 02.03.2017 в 08:31. |
![]() |
![]() |
![]() |
#17 | |||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,542
|
![]() Цитата:
ну как же, им же(потокам) надо чтобы форма отобразила их новые данные. А зачем это? Сбросил данные в память(в переменную) и работай дальше. А покажет или нет форма это НЕ ЕГО(потока) забота. Поток при продолжении может спокойно без ущерба себе сбросить и новые данные даже если форма и не отразила предыдущие. А форма спокойно отразит новые (актуальные на данный момент времени). Цитата:
Цитата:
мы. развязать (избавиться от синхронизации) потоки и форму. вы. синхронизировать отсчет тиков таймера в потоках и реальные часы. при расчетах по количеству срабатываний таймера наличие БОЛЬШОГО(>>число ядер проца) количества потоков обязательно приведет к рассогласованию с реальным временем. http://www.programmersforum.ru/showthread.php?t=276605 http://www.programmersforum.ru/showthread.php?t=274699
программа — запись алгоритма на языке понятном транслятору
|
|||
![]() |
![]() |
![]() |
#18 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
![]()
В этом то и проблема: я спрашиваю как синхронизировать потоки между собой; вы пытаетесь меня от этого избавить.
Потому что поток и форма пытается обратиться к их общему ресурсу. А если произойдёт ситуация, в которой поток записывает, и форма считывает одновременно ? Для одноядерного процессора это не проблема (технические детали); а вот если форма в одном ядре, а поток в другом - тогда это действительно может произойти в буквальном смысле одновременно. Независимо от того, ждёт ли поток пока форма заберёт данные, наблюдается следующая картина: Поток расчёта времени ожидания посчитал это время, и ушёл спать на одну секунду; форма неважно как часто (пусть это будет 10 раз в секунду) забирает данные. Первый поток выложил данные, форма забрала эти данные в первые 100 мс; второй поток выложил данные, форма забрала эти данные в третьи 100 мс. Восьмой поток выложил данные, форма забрала данные во вторые 100 мс. Ну и так далее. Получается, для синхронного вывода нужно либо синхронизировать потоки между собой, либо что бы форма ждала, пока все потоки выложат данные для обновления. Я же стараюсь в принципе избавить форму от постоянно повторяющихся операций.
Подпись ? Не, не слышал ...
|
![]() |
![]() |
![]() |
#19 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,542
|
![]() Цитата:
здесь все время говорилось о некоем оставшемся времени(времени ожидания). Эти данные о времени и есть эти данные. Какой смысл в ожидании времени ожидания. Смысл имеет только ОКОНЧАНИЕ времени ожидания. именно отсюда и наши попытки избавить форму от не знаю чего. 2. что делает поток потом после выкладывания? ждет когда "можно" будет выложить новую "порцию" обновления. 3.что делает форма с полученной инфой? выводим в label. Цитата:
но опять же, при большом числе потоков данное ожидание может затянуться. что должны делать потоки сбросившие свою инфу форме, в то время как другие еще этого не сделали. 1. ждать остальных. 2. продолжать получать новую инфу. 1. у каждого потока должен быть флаг (обычно таким объектом бывает объект синхронизации семафор) доступный и ей и форме, который он (поток) устанавливает при сбросе данных форме и начинает ожидание. А форма после получения инфы от всех и ее обработки сбрасывает ВСЕ флаги по порядку (или по выбору известному ей). сброс флага(семафора) позволяет потоку продолжить свою "полезную" деятельность.
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 02.03.2017 в 10:35. |
||
![]() |
![]() |
![]() |
#20 |
Спокойный псих
Участник клуба
Регистрация: 19.03.2013
Сообщений: 1,538
|
![]()
Это ещё почему ? Я хочу, что бы потоки ожидания "работали сообща", выводили информацию одновременно.
Я и хочу этого избежать, тем способом, который уже написал - синхронизировать потоки между собой, да бы эти потоки "работали сообща". Мой велосипед, который я написал раньше, нормально работает, но только в режиме отладки; в обычном режиме потоки не успевают друг за другом.
Подпись ? Не, не слышал ...
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Синхронизация потоков | _ZixeL_ | Общие вопросы Delphi | 14 | 10.09.2015 22:23 |
Синхронизация потоков | Fireblade-fan | Общие вопросы Delphi | 5 | 17.12.2012 01:57 |
Синхронизация потоков | _Bers | Общие вопросы C/C++ | 5 | 23.12.2011 22:57 |
синхронизация потоков | m_kostik | Win Api | 0 | 26.03.2010 23:56 |