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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2017, 17:04   #11
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
ВСЕ что потокам надо сделать это обеспечить корректное заполнение переменных
Я заполняю переменные Label.Text, не аргумент ? И хочу делать это синхронно.
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
не знаю, а лейблы на форме причем?
При том, что я выбрал вывод инфы именно в лейбы. И на интерфейсе мне больше пока ничего не надо.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 01.03.2017 в 17:09.
OmegaBerkut вне форума Ответить с цитированием
Старый 01.03.2017, 17:14   #12
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Я заполняю переменные Label.Text,
это не переменная, а текстовое свойство ВИЗУАЛЬНОГО (отображаемого) объекта (окна).
так вот задача поставленная тобой в нашем понимании
КАК я могу синхронно заполнять набор визуальных объектов если изменения происходят НЕ одновременно.

наше решение.
НАКАПЛИВАТЬ изменения в некоем буфере (переменных НЕ ИМЕЮЩИХ визуализации) и выводить их блоком (делать синхронный вывод).
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 01.03.2017, 17:16   #13
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
и выводить их блоком
В этом то и проблема ... Я хочу избежать такой ситуации, в которой чем больше блок - тем дольше вывод.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 01.03.2017, 17:37   #14
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Я хочу избежать такой ситуации, в которой чем больше блок - тем дольше вывод.
так время ожидания для всех "задействованных" потоков (обратный отсчет) и МЕНЯЕТСЯ у всех с каждой СЕКУНДОЙ значит и выводить надо ВСЕГДА все и постоянно (25 раз в секунду).
или же ...
отсчет идет по МИНУТАМ и случаются простои в изменяемом времени.

ЗАДАЧА. Уменьшить объем обновляемой формой информации. НЕ обновлять данные если они действительно не изменялись.

т.е. форма во время СВОЕГО вывода должна проверять наличие изменений.

1. Рядом с переменной времени ожидания делаем ЕЩЕ ОДНУ переменную флаг изменения и поток устанавливает его(для каждого потока свой, также как и время) ОДНОВРЕМЕННО с изменением времени.
А форма во время своего вывода проверяет данные флагИ и меняет/не трогает label. ПОСЛЕ этого сбрасывает данный флаг.

2. флаг совмещенный со временем.
поток записывает время в переменную.
форма выводит значение и "сбрасывает" его в 0 (к примеру).
при следующей итерации вывода НЕЗАВИСИМОЙ от потока форма ПРОВЕРЯЕТ
время и если оно есть (отличное от "сброшенного значения" ) выводит (обновляет label) и выполняет "сброс", в противном случае все остается по прежнему.

3. делаем еще один блок(массив) времен которым будет пользоваться исключительно форма.
при выводе КОПИРУЕМ туда выводимое время.
а при следующем выводе ПРОВЕРЯЕМ
совпадение => данные не были изменены и вывод не нужен
или
НЕсовпали =>данные изменились и неплохо было бы вывести, а потом и скопировать.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 01.03.2017 в 17:45.
evg_m на форуме Ответить с цитированием
Старый 01.03.2017, 17:59   #15
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

evg_m, хорошо, флаг вывода - тоже полезная вещь ...
И всё таки ... Как организовать синхронизацию внутри потоков ?
Это уже вопрос личного интереса.

upd: вот такой вот синхронизатор в целом работает:
Код:
threadSync++;
while (threadSync<threadCount) {}
threadSync--;
Время не выводится "беспорядочно". Но, я думаю, что недостатки вы сами знаете.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 01.03.2017 в 18:26.
OmegaBerkut вне форума Ответить с цитированием
Старый 02.03.2017, 05:15   #16
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
НЕ обновлять данные если они действительно не изменялись.
В качестве флага вывода можно использовать null. Без дополнительной переменной ... Ну и в качестве буфера вывода строка ...

upd: в итоге, полученная реализация оказалась сильно завязана на то, что происходит на форме. Здесь же мне рассказывали, что это неправильно.
До этого у меня на форме выполнялось только управление задачами (они же потоки). Теперь ещё и таймер, который раз в 100 мс выполняет обновление инфы.
Зато, потоки синхронизированы, но не между собой (как я изначально хотел), а с формой - ждут, пока форма заберёт данные.

upd 2: и всё равно нужно синхронизировать потоки между собой; потому что как только большой поток вернулся после выполнения опять на таймаут - вывод происходит независимо от соседних потоков; пересчёт показывает разницу в пол секунды, хотя форма вроде как бы обновляется раз в 100 мс: за один тик таймера обновляются только те компоненты, которые нуждаются в обновлении, даже если обновлять все - это ничего не меняет; потоки вычисляют время, и делают задержку 1 секунду; за эту секунду форма успевает проверить все потоки 10 раз; первый выбившийся поток за пределы первых 100 мс будет обновлён в последующие 100 мс, в которых этот поток выложил данные для обновления - именно в этом месте видны результаты асинхрона.
Вы писали, что форма должна обновлять данные не 10, а 25 раз в секунду; собственно, это так же ничего не меняет в лучшую сторону, а только дополнительно грузит процессор. Сегментацию времени вывода нужно не увеличивать, а уменьшать, что изначально неправильно, так как в итоге окажется, что надо синхронизировать потоки НЕ только между собой, но и с формой дополнительно. Что уже можно назвать "дурной работой".

Какие ещё будут предложения ?
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 02.03.2017 в 08:31.
OmegaBerkut вне форума Ответить с цитированием
Старый 02.03.2017, 09:30   #17
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
а с формой - ждут, пока форма заберёт данные.
а ЗАЧЕМ им ждать?
ну как же, им же(потокам) надо чтобы форма отобразила их новые данные.
А зачем это? Сбросил данные в память(в переменную) и работай дальше. А покажет или нет форма это НЕ ЕГО(потока) забота.
Поток при продолжении может спокойно без ущерба себе сбросить и новые данные даже если форма и не отразила предыдущие. А форма спокойно отразит новые (актуальные на данный момент времени).

Цитата:
что форма должна обновлять данные не 10, а 25 раз в секунду
я имел в виду что чаще не надо, хотите реже, ради бога.

Цитата:
- именно в этом месте видны результаты асинхрона.
пожалуйста поподробнее. А то мне кажется мы решаем немного разные задачи.
мы. развязать (избавиться от синхронизации) потоки и форму.
вы. синхронизировать отсчет тиков таймера в потоках и реальные часы.

при расчетах по количеству срабатываний таймера наличие БОЛЬШОГО(>>число ядер проца) количества потоков обязательно приведет к рассогласованию с реальным временем.
http://www.programmersforum.ru/showthread.php?t=276605
http://www.programmersforum.ru/showthread.php?t=274699
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 02.03.2017, 09:45   #18
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
мы. развязать (избавиться от синхронизации) потоки и форму.
В этом то и проблема: я спрашиваю как синхронизировать потоки между собой; вы пытаетесь меня от этого избавить.
Цитата:
Сообщение от evg_m Посмотреть сообщение
ну как же, им же(потокам) надо чтобы форма отобразила их новые данные
Потому что поток и форма пытается обратиться к их общему ресурсу. А если произойдёт ситуация, в которой поток записывает, и форма считывает одновременно ? Для одноядерного процессора это не проблема (технические детали); а вот если форма в одном ядре, а поток в другом - тогда это действительно может произойти в буквальном смысле одновременно.
Цитата:
Сообщение от evg_m Посмотреть сообщение
пожалуйста поподробнее
Независимо от того, ждёт ли поток пока форма заберёт данные, наблюдается следующая картина:
Поток расчёта времени ожидания посчитал это время, и ушёл спать на одну секунду;
форма неважно как часто (пусть это будет 10 раз в секунду) забирает данные.

Первый поток выложил данные, форма забрала эти данные в первые 100 мс;
второй поток выложил данные, форма забрала эти данные в третьи 100 мс.
Восьмой поток выложил данные, форма забрала данные во вторые 100 мс.

Ну и так далее. Получается, для синхронного вывода нужно либо синхронизировать потоки между собой, либо что бы форма ждала, пока все потоки выложат данные для обновления. Я же стараюсь в принципе избавить форму от постоянно повторяющихся операций.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 02.03.2017, 10:20   #19
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Первый поток выложил данные, форма забрала эти данные в первые 100 мс;
1. КАКИЕ данные?
здесь все время говорилось о некоем оставшемся времени(времени ожидания). Эти данные о времени и есть эти данные.
Какой смысл в ожидании времени ожидания. Смысл имеет только ОКОНЧАНИЕ времени ожидания. именно отсюда и наши попытки избавить форму от не знаю чего.
2. что делает поток потом после выкладывания?
ждет когда "можно" будет выложить новую "порцию" обновления.
3.что делает форма с полученной инфой?
выводим в label.


Цитата:
либо синхронизировать потоки между собой, либо что бы форма ждала, пока все потоки выложат данные для обновления.
В такой постановке, ДА форма должна ждать ВСЕХ обновлений, но никак не потоки следить друг за другом.
но опять же, при большом числе потоков данное ожидание может затянуться.

что должны делать потоки сбросившие свою инфу форме, в то время как другие еще этого не сделали.
1. ждать остальных.
2. продолжать получать новую инфу.

1. у каждого потока должен быть флаг (обычно таким объектом бывает объект синхронизации семафор) доступный и ей и форме, который он (поток) устанавливает при сбросе данных форме и начинает ожидание.
А форма после получения инфы от всех и ее обработки сбрасывает ВСЕ флаги по порядку (или по выбору известному ей).
сброс флага(семафора) позволяет потоку продолжить свою "полезную" деятельность.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 02.03.2017 в 10:35.
evg_m на форуме Ответить с цитированием
Старый 02.03.2017, 10:31   #20
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
но никак не потоки следить друг за другом
Это ещё почему ? Я хочу, что бы потоки ожидания "работали сообща", выводили информацию одновременно.

Цитата:
Сообщение от evg_m Посмотреть сообщение
В такой постановке, ДА форма должна ждать ВСЕХ обновлений
Цитата:
Сообщение от evg_m Посмотреть сообщение
при большом числе потоков данное ожидание может затянуться
Я и хочу этого избежать, тем способом, который уже написал - синхронизировать потоки между собой, да бы эти потоки "работали сообща".
Мой велосипед, который я написал раньше, нормально работает, но только в режиме отладки; в обычном режиме потоки не успевают друг за другом.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация потоков _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