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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2015, 10:19   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию Как сделать программу, если нужно выдавать данные четко по времени

Нужна программа, работающая как бы в реальном времени. Мне нужно преобразовывать текстовую информацию в некоторый мой сигнал и записывать в текстовый файл так, чтобы в итоге в текстовом файле каждые новые 1024 отсчета появлялись четко через каждые 50 мс.
50 мс - я так понял если я вывожу графики - они должны просто летать, то есть я даже не должен замечать отдельных функций, функция просто должна болтыхаться, как анимация. А у меня задержка между сменами графиков приличная.
Вот тут я и понял, что у меня сейчас только процесс обработки занимает порядка 100 мс и даже больше. А мне эти данные нужны хотя бы раз в 50мс. Что можно сделать?
По идее, подобные системы давно делаются другими разработчиками, ничего не лагает. Просто для меня это первая отладка приложения на полной скорости. И надо понять, как это сделать. Можно и оптимизировать код, ну жду Ваших предложений!

Представьте себе систему передачи информации. Программно-определяемая радиосистема, если слышали. Вот мне желательно бы в нее данные подгружать с компьютера. Можно просто больше выборок за раз генерировать. В общем, мне нужен Ваш опыт!
Krasi вне форума Ответить с цитированием
Старый 13.11.2015, 10:27   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)можно разделять на потоки, один обработает данные, без всякой графики, и передаст их набором другому потоку, который уже все выведет.
2)для справки, Windows не является системой реального времени. и не выдаст вам точности ровно 50мс.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.11.2015, 10:45   #3
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

А мне нужно не точно 50 мс, а хотя бы менее 50 мс.
Krasi вне форума Ответить с цитированием
Старый 13.11.2015, 11:44   #4
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Цитата:
можно разделять на потоки, один обработает данные, без всякой графики, и передаст их набором другому потоку, который уже все выведет
шикарно! А я читал о потоках, но можно еще посмотреть что-то? Мне конкретно тогда нужно понять, как написать:

Код:
Поток 1 {обработка без всякой графики}
Поток 2(результат) {вывод и сохранение}
Krasi вне форума Ответить с цитированием
Старый 13.11.2015, 11:54   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

Простой пример выглядит как-то примерно так http://programmersforum.ru/showthrea...38#post1535544 или так http://programmersforum.ru/showthread.php?t=268067 (во втором примере вместо .Send для этого случая вероятно больше подходит .Post, чтоб не тормозить второй поток)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 13.11.2015, 12:08   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Krasi Посмотреть сообщение
А мне нужно не точно 50 мс, а хотя бы менее 50 мс.
Переходите на системы реального времени
p51x вне форума Ответить с цитированием
Старый 13.11.2015, 12:21   #7
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Ок, хочу спросить конкретно тогда по одной из Ваших ссылок, потому что сколько пялюсь в код, до меня пока не доходит. Я написал в комментах все, что понял. Можно попроще? Как мне конкретно сделать, чтобы в 1 потоке была обработка данных, а в другом вывод на графики. Допустим, обработка данных - data = data_proc(inputs), a вывод на графики: PlotAndSave(data). тогда смотрите, я хоть что-то понял в коде?

Код:
//await BrutePassword(progress, 4); // В функции сразу 4 потока. 
private async void btnStart_Click(object sender, EventArgs e)
        {
            btnStart.Enabled = false;

            var progress = new Progress<string>();
            progress.ProgressChanged += (o, s) => textBox1.AppendText(s + Environment.NewLine);

            await BrutePassword(progress, 4);

            btnStart.Enabled = true;


        }


private async Task BrutePassword(IProgress<string> progress, int threadCount)
        {
            var tasks = new List<Task>();

            for (int i = 0; i < threadCount; i++)
            {
                int startNumber = 1000 * i;
                int endNumber = 1000 * (i + 1);

                var threadId = i + 1;

                var task = Task.Run(() =>
                {
                    for (int num = startNumber; num < endNumber; num++)
                    {
                        data = data_proc(inputs);
                    }
                });

                tasks.Add(task);
            }

            await Task.WhenAll(tasks);
А не, я не понял. Куда можно вставить обработку данных, а куда построение графиков?

Последний раз редактировалось Krasi; 13.11.2015 в 12:28.
Krasi вне форума Ответить с цитированием
Старый 13.11.2015, 12:59   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну дык надо не пялиться, а гуглить материал на эту тему, читать документацию. Под вторым примером даже было немного ссылок.

startNumber и т.п. это просто входные данные потока в том примере (разделить диапазон чисел от 0 до 4000 на 4 потока и в каждом потоке генерировать хеш для каждого числа от startNumber до endNumber и выводить число; генерации хеша там нет, просто сразу вывод).

Вместо того цикла for тут видимо нужен бесконечный цикл типа такого:
Код:
while (true)
{
    получить/обработать данные;
    progress.Report(результат);
}
Обработчик события ProgressChanged (в основном/UI потоке) это то, куда поступают данные переданные в Report, и где их надо выводить и т.п.

Progress<T> это появившаяся в .NET 4.5 более удобная обертка над SynchronizationContext (SynchronizationContext используется во втором примере, в старых примерах обычно используется он или myWinFormsControl.Invoke/BeginInvoke).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 13.11.2015 в 14:56.
Alex11223 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать ссылку если данные загружаются с баззы даных влдаислав PHP 3 28.01.2015 05:46
Всем доброго времени суток!Если можете помогите пожалуйста переделать программу под сдвиг единицы по синусойде Ddradok Помощь студентам 0 14.12.2014 21:13
Помогите!!!!!!!!))) нужно сделать в кратчайшие сроки а времени у меня не очень!)) Illya Помощь студентам 0 05.11.2013 21:12
Как извлечь данные в таблицу, если нужно посылать сразу множество запросов? Novichok PHP PHP 1 28.03.2011 19:28
Мне нужно выбрать данные из первого запроса, если он вернул хоть одно число=числу из nata Общие вопросы Delphi 8 05.06.2007 23:57