Многопоточное программирование
11 Января 2025, 16:23:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: С 1-го августа 2013 объявляется бессрочный месячник по борьбе с матом
   Начало   Главная Поиск Правила Камасутра Блоги Чат (1) Галерея Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Многопоточное программирование  (Прочитано 921 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Paramedic ТС

*******

Карма +1518/-10
Offline Offline

Пол: Мужской
Сообщений: 20017

Иваново


Тиран и Диктатор

WWW

Иваново
Megane III Expression, МКПП5, +ESP (Был ИЖ-2126-30)
« : 13 Июля 2005, 15:52:12 »

Сижу, ломаю голову. Есть ацп от фирмы LCard. Дрова рабочие. всё пучком. Работает в асинхронном режиме. Чтобы поймать данные, организую я отдельный тред. В этом треде запускаю сбор данных. Подгатавливаю OVERLAPPED структуру и жду waitforsingleobject. Данные получены, я их кидаю в файл. Всё замечателно.

Теперь стоит задача обработать и отобразить полученные данные в реальном времени. Вот тут то я и призадумался. Как бы это получше сделать? Какие есть идеи, предложения, алгоритмы быстрой отрисовки на экране, etc.

Буду признателен за любые предложения.
Записан

Это сейчас мода такая — задавать глупые вопросы с невинным видом, типа, "всё совсем не так, как вам кажется"?

SergeiSS
Гость
« Ответ #1 : 13 Июля 2005, 16:34:04 »

Цитировать
Оригинальное сообщение от  Paramedic
Теперь стоит задача обработать и отобразить полученные данные в реальном времени. Вот тут то я и призадумался. Как бы это получше сделать? Какие есть идеи, предложения, алгоритмы быстрой отрисовки на экране, etc.

Буду признателен за любые предложения.

По-моему, тут особой проблемы нету Smile
Я бы сначала создал Thread и передавал ему данные. А уже в нем организовал обработку (прорисовку, запись в файл и т.д.). Можно и несколько потоков сделать. Один для прорисовки, другой - для записи.

PS. Сорри, перечитал свой ответ и понял, что ничего нового не добавил Smile
В чем основная проблема-то?
Записан
sf
Гость
« Ответ #2 : 13 Июля 2005, 19:52:03 »

Во первых, как отобразить данные? Графиком или таблицей?
Если данные часто изменяются, то графиком (ИМХО) нагляднее.
Если все-таки числами, то не используйте стандартные элементы типа TMemo или TListBox - будут тормоза.

А вообще, если есть желание, могу помочь. Живу в районе автовокзала. Если понадобится, пишите мылом, встретимся, обсудим Smile. sfsoft собака mail.ru
Записан
AndyAP
Малая народность Вятки
Ветеран форума
******

Карма +1341/-4
Offline Offline

Пол: Мужской
Сообщений: 6321

Киров (43)


был ИЖ 2126-030, ВАЗ/ОМСК, 04.2002-07.2011, 173 т.

WWW
« Ответ #3 : 13 Июля 2005, 21:44:39 »

Я решал такую задачу. У меня была 16 канальная АЦП, надо было асинхронно писать телефонные переговоры. Могу сорцы выслать, если надо...
Записан

Правила поведения на форуме
Только одно делает исполнение мечты невозможным - это страх неудачи (c) П. Коэльо "Алхимик"
Suum cuique
Paramedic ТС

*******

Карма +1518/-10
Offline Offline

Пол: Мужской
Сообщений: 20017

Иваново


Тиран и Диктатор

WWW

Иваново
Megane III Expression, МКПП5, +ESP (Был ИЖ-2126-30)
« Ответ #4 : 14 Июля 2005, 08:34:11 »

Рисовать нужно графику. 2Сергей СС: проблема есть. Получаю я данные неким блоком. В отдельном потоке. Сижу и жду waitforsingleobject. Как только дождался, данные в файл. Вот они лежат себе в файле, а нужно
1. Рисовать графики (во множественном числе)
2. Принимать решение о воздействии на управляющие органы

При этом частота сбора довольно велика. И я вообще сомневаюсь, что можно успеть нарисовать что либо. Причём, рисовать нужно не всё подряд. Это было бы легко, а вычленять из потока данных некий процесс. Причём процесс этот не будет любезно ложиться в полученный буфер. Возможно он только начнётся. А дорисовывать его придётся только после получения очередной порции. Вот сижу и думаю, чего такого прикрутить, чтобы оно с этими полученными данными работало, терпеливо ждало, если их ещё не хватает, и догоняло, если отстало.

За АТС спасибо, но у меня подобный проект работает на станции NEC, проблем с ним не испытываю.

Придётся в район автовокзала идти Smile Хоть чипсов поем.
Записан

Это сейчас мода такая — задавать глупые вопросы с невинным видом, типа, "всё совсем не так, как вам кажется"?

SergeiSS
Гость
« Ответ #5 : 14 Июля 2005, 11:36:49 »

Цитировать
Оригинальное сообщение от  Paramedic
Получаю я данные неким блоком. В отдельном потоке. Сижу и жду waitforsingleobject. Как только дождался, данные в файл. Вот они лежат себе в файле, а нужно
1. Рисовать графики (во множественном числе)
2. Принимать решение о воздействии на управляющие органы

При этом частота сбора довольно велика. И я вообще сомневаюсь, что можно успеть нарисовать что либо. Причём, рисовать нужно не всё подряд. Это было бы легко, а вычленять из потока данных некий процесс. Причём процесс этот не будет любезно ложиться в полученный буфер. Возможно он только начнётся. А дорисовывать его придётся только после получения очередной порции. Вот сижу и думаю, чего такого прикрутить, чтобы оно с этими полученными данными работало, терпеливо ждало, если их ещё не хватает, и догоняло, если отстало.

По-моему, ты уже сам полностью описал алгоритм, который остается только описать на языке программирования...
А именно, используем несколько потоков, каждый из которых является узкоспециализированным.
"Поток 1" принимает данные (тот самый твой waitforsingleobject работает). Но ни в какой файл он их не кладет!!! Эта задача убъет всю производительность.
Как только данные получены (или сработал таймер у waitforsingleobject), данные выкладываются в буфер и функцией ResumeThread включаются ранее созданные "Поток 2"  ("записыватель" - запись данных в файл) и "Поток 3" ("отображатель" - отображение данных на экране). Эти 2 потока берут данные из буфера.
И дальше ты уже можешь оптимизировать каждый из потоков.
Например, "Поток 2" может выкладывать данные в файл не сразу после получения, а после накопления какой-то "весомой" порции. Для того, чтобы уменьшить количество дисковых операций. А "Поток 1" в это время работает независимо, собирает данные...
Аналогично и "Поток 3" фильтрует "базар" и по указанным тобой критериям либо пропускает данные, либо выводит их на экран.
Можно даже сделать так, что 3-й поток занимается только фильтрацией данных для отображения и передает отфильтрованные данные (через еще один буфер) в "Поток 4", который уже занимается выводом на экран. Можно еще больше "навернуть": для каждого графика и каждой выводимой таблицы - свой поток.

Как вариант - "Поток 2" занимается только фильтрацией полученных данных. А затем передает их другим потокам (3-й, 4-й, энный): одни - для записи в файл, другие - для отображения.

Если требуется какая-то обработка между получением и отображением, то: либо просто появляется промежуточный поток-обработчик между потоком-сборщиком и потоком-отображателем, либо обработка производится непосредственно в потоке-отображателе.

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

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

Уф.... Устал писать уже Smile
Записан
Paramedic ТС

*******

Карма +1518/-10
Offline Offline

Пол: Мужской
Сообщений: 20017

Иваново


Тиран и Диктатор

WWW

Иваново
Megane III Expression, МКПП5, +ESP (Был ИЖ-2126-30)
« Ответ #6 : 14 Июля 2005, 13:14:48 »

переберусь ка я в ICQ для неспешного обсуждения.
Записан

Это сейчас мода такая — задавать глупые вопросы с невинным видом, типа, "всё совсем не так, как вам кажется"?

glory
Гость
« Ответ #7 : 14 Июля 2005, 13:21:09 »

Надо делать циклический буфер в области shared memory. Область доступна для всех процессов. Один процесс туда складывает данные, второй выбирает  оттуда очередные  данные и пишет их в  файл, третий рисует. Размер буфера должен быть достаточным для исключения  потери  информации. Если эти процессы реализуются в рамках одного приложения в виде нитей, то shared не нужно, можно обойтись простой памятью.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines

Яндекс.Метрика

Google последней посетил эту страницу 22 Июня 2024, 14:22:38