|
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 5
|
|
Обмен данными между потоками18.02.2014, 17:59. Показов 13226. Ответов 29
Метки нет (Все метки)
Здравствуйте уважаемые форумчане!
Реализую многопоточное приложение. Один поток в реальном времени читает данные с USB и пишет их в массив (массив большой, 256*65536), второй должен эти данные обрабатывать (нарезать на другие массивы, поменьше, что-то делать с ними, результат складывать в финальный массив), третий занимается тем, что выводит финальный массив на Panel. Потоки делаю не CreateThread, а TThread, ради VCL-компонентов. Вопрос вот в чем: как реализовать обмен данными между потоками? Иными словами, как первый большой массив передать из 1го потока во 2ой и как передать последний массив из 2го потока в 3й? С классами на данный момент знаком очень поверхностно, раньше только с функциями работал. Заранее спасибо за помощь!
0
|
|
| 18.02.2014, 17:59 | |
|
Ответы с готовыми решениями:
29
Обмен данными между компьютером и ПЛК по TCP Обмен данными между RAD Studio Berlin и cmd Обмен данными между программой и сервисом через NamedPipe |
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|
| 19.02.2014, 04:21 | |
|
Иметь общий массив, который будет видится со всех потоков не проблема (например глобальная переменная), но это не главное.
Делаем два буферных массива. Пока 1ый поток пишет в 1ый буфер, 2ой поток обрабатывает второй массив, затем меняются местами. Нужно смотреть в сторону event-ов http://www.firststeps.ru/mfc/winapi/r.php?119 Я бы сказал, синхронизация потоков это задача не для новичка.
0
|
|
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
|
| 19.02.2014, 08:46 | |
|
Еще один вариант: первый поток заполняет здоровый массив и в конце заполнения выбрасывает флаг. Второй поток ждет этого флага и, получив его, заполняет свои маленькие массивы. По окончанию заполнения выбрасывает так же свой флаг. По флагу второго потока первый убирает свой и готовится к приему новой порции данных. В то же время, третий поток, видя флаг второго начинает вывод маленьких массивов.
Так как потоки не изменяют данные друг друга, а только читают их, то можно обойтись без серьезной синхронизации.
0
|
|
|
|
|||
| 19.02.2014, 12:30 | |||
|
Добавлено через 2 минуты Если данный только читаются это не означает что их не нужно синхронизировать.
0
|
|||
|
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 5
|
|
| 19.02.2014, 13:07 [ТС] | |
|
SatanaXIII, то есть будет достаточно сделать большой массив глобальной переменной, писать в него в 1м потоке, но запретить изменять её во 2 потоке (аналогично и для потоков 2 и 3) и добавить пару флагов, которые сообщал бы следующему потоку, что данные можно забирать?
Я как-то так и предполагал, но меня это смущает только тем, что глобальные переменные присущи С, в С++ рекомендуется их всячески избегать. В принципе, я понимаю, что если внимательно проследить, чтобы два класса не меняли данные одновременно, то ничего страшного нет, но думал, что есть какой-то более правильные метод обмена данными. gumi250, в вашем варианте не может быть такого, что первый поток хочет писать данные, но второй ещё не закончил обработку и не дает ему это делать, из-за чего данные теряются? Ещё один вопрос: мою задачу можно реализовать на таймерах TTimer, не связываясь с потоками. Насколько это решение хуже/лучше/правильней/неправильней потоков? Не смог найти никакой информации об этом.
0
|
|
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
|||||||
| 19.02.2014, 13:45 | |||||||
|
Можно не выставлять флаги, а, как предлагает gumi250, отсылать сообщения. Вариантов куча.
0
|
|||||||
|
|
|||||
| 19.02.2014, 14:29 | |||||
|
Объект синхронизации можно рассматривать как флаг, но не наоборот. Объект синхронизации должен гарантировать атамарность операции. Добавлено через 3 минуты Но правильнее сформулировать это так: переменная должна быть максимально локальной, насколько это возможно. Добавлено через 4 минуты Добавлено через 6 минут Зачем тут два потока? Почему нельзя сразу читать данные "маленькими массивами" и помещать в двухмерный массив или вектор? Существование третьего потока тоже сомнительно, но тут зависит от динамики, и способа вывода.
0
|
|||||
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
||
| 19.02.2014, 16:21 | ||
|
Один большой буфер который помнит ВСЕ данные от начала до конца при большом потоке быстро заполнится. Добавлено через 4 минуты Да Avazart прав, флагом не должна быть просто переменная, чтобы второй поток не крутил цикл в ожидании когда выставится этот флаг. Второй поток должен засыпать до выставления флага..
0
|
||
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
|
| 20.02.2014, 08:32 | |
|
Avazart, gumi250, короче вы хотите сказать, что осуществить синхронизацию посредством изменения потоком своих же данных невозможно?
0
|
|
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
|
| 20.02.2014, 13:14 | |
|
0
|
|
|
|
||
| 20.02.2014, 13:17 | ||
|
1. Откуда второй поток знает что первый не завершил работу и перестал существовать в месте со своей флаговой переменной? Что говорит о непродуманности реализации. 2. На каких основаниях мы полагаемся на атомарность этой переменной? Поток и и данный нужно хранить отдельно, и на данные "вешать замок" в виде объекта синхронизации.
0
|
||
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
||
| 20.02.2014, 13:21 | ||
|
2) Только один поток может изменить эту переменную.
0
|
||
|
|
|||
| 20.02.2014, 13:23 | |||
|
Один может не успеть изменить, а второй успеть прочитать "недоизмененное", еще раз вы читать не умеете слово атомарность ? http://ru.wikipedia.org/wiki/%... 0%B8%D1%8F
0
|
|||
|
Почетный модератор
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
|
|||
| 20.02.2014, 13:33 | |||
|
0
|
|||
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
||
| 20.02.2014, 14:02 | ||
|
0
|
||
|
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
|
|||
| 20.02.2014, 14:53 | |||
|
0
|
|||
|
|
||||
| 20.02.2014, 14:58 | ||||
|
Обращение к данным идет из разных потоков ? -Да, значит это разделяемый ресурс.
0
|
||||
| 20.02.2014, 14:58 | |
|
Помогаю со студенческими работами здесь
20
Обмен данными между C++ Builder и Java компонентами socket-ов Обмен данными по сети интернет ServerSocket и ClientSocket обмен данными Обмен данными через COM порт Обмен данными через интернет Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|