Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/65: Рейтинг темы: голосов - 65, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 5

Обмен данными между потоками

18.02.2014, 17:59. Показов 13213. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане!
Реализую многопоточное приложение. Один поток в реальном времени читает данные с USB и пишет их в массив (массив большой, 256*65536), второй должен эти данные обрабатывать (нарезать на другие массивы, поменьше, что-то делать с ними, результат складывать в финальный массив), третий занимается тем, что выводит финальный массив на Panel. Потоки делаю не CreateThread, а TThread, ради VCL-компонентов.
Вопрос вот в чем: как реализовать обмен данными между потоками? Иными словами, как первый большой массив передать из 1го потока во 2ой и как передать последний массив из 2го потока в 3й? С классами на данный момент знаком очень поверхностно, раньше только с функциями работал.
Заранее спасибо за помощь!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.02.2014, 17:59
Ответы с готовыми решениями:

Обмен данными между компьютером и ПЛК по TCP
Добрый день! Подскажите пожалуйста, реально ли написать программу на C++ Builder для получения данных с контроллера (ПЛК) по протоколу TCP?...

Обмен данными между RAD Studio Berlin и cmd
Всем привет. Как реализовать обмен данными между C++ и cmd. Отправляю команду в консоль, а из консоли мне возвращается результат

Обмен данными между программой и сервисом через NamedPipe
Всем доброго времени суток. Друзья, у меня такая проблема: Создаю сервис, на OnExecute создаю канал с правами на доступ для всех и...

29
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
20.02.2014, 15:09
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Avazart Посмотреть сообщение
Для академичекого интереса лучше книги почитать.
Теория без практики мертва
Цитата Сообщение от Avazart Посмотреть сообщение
Цитата Сообщение от gumi250 Посмотреть сообщение
Причем подразумевается что прцесс чтения быстрее записи.
C потоками такие допущения делать нельзя.
Никак иначе быть не может, данные должны обрабатывать быстрее чем их получают, иначе их некуда будет девать.
Цитата Сообщение от Avazart Посмотреть сообщение
Как это меняет дело?
2 общих буффера, 2 общих флага-переменных bool f1, f2. Перед началом записи в 1ый буфер первый поток делает f1=true, по окнчании записи делает f1=false.Для второго буффера аналогично, но с флагом f2. Второй поток в ожидании крутит цикл и ждет когда настанет !f1 или !f2 чтобы начать чтение из соответствующего буфера. Как тут может возникнуть чтение кривых данных?
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.02.2014, 15:57
Цитата Сообщение от gumi250 Посмотреть сообщение
Никак иначе быть не может, данные должны обрабатывать быстрее чем их получают, иначе их некуда будет девать.
То как должно быть, но то как есть...
Собственно это и нужно обеспечить программисту.
Цитата Сообщение от gumi250 Посмотреть сообщение
2 общих буффера, 2 общих флага-переменных bool f1, f2.
Цитата Сообщение от gumi250 Посмотреть сообщение
Как тут может возникнуть чтение кривых данных?
bool не атомарный тип данных,точнее сказать нет гаранитии что операции над bool атомарны.
Переменная bool так же разделяемая ресурс, как и другие данные.

Цитата Сообщение от gumi250 Посмотреть сообщение
Второй поток в ожидании крутит цикл и ждет когда настанет !f1 или !f2 чтобы начать чтение из соответствующего буфера. Как тут может возникнуть чтение кривых данных?
Про "кручения в цикле" вообще молчу ...

Не по теме:

Любители поучить плохому ...

0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
20.02.2014, 16:04
Avazart, вы сами почитайте, что я пишу. Я же вам говорю, что да, правильно делать синхронизацию не костылями, а проверенными методами. Кто спорит? Но так же говорю, что можно (я не выставляю это как какую-то безоговорочную истину) реализовать синхронизацию своими руками. Вы чуете разницу или опять не чуете? А конкретнее через выставление флага окончания работы с разделяемыми данными (хоть булевого, хоть бит какой-нибудь изменять по определенному адресу, чтобы влезло в такт). Даже не нужно запариваться с атомарностью - первый поток закончил работу с данными, выставил флаг "Я закончил", второй поток постоянно смотрит на флаг первого, и хоть тот ему будет черта лысого показывать, хоть анекдоты травить, пока не увидит четкого "Я закончил" к данным не притронется. Порченные, некорректные кто? Флаги? Наплевать. Данные? Зачем поток будет портить данные во время работы? А другие к нему не сунутся, так как флаги. И где что порченное? О чем вы?
Прекратите читать то, что вы хотите видеть - читайте, что до вас пытаются донести.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.02.2014, 16:15
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Прекратите читать то, что вы хотите видеть - читайте, что до вас пытаются донести.
Ну так что я предложил использовать bool для синхронизации?
Или я ввел неуместный термин "флаг" ?

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Avazart, вы сами почитайте, что я пишу. Я же вам говорю, что да, правильно делать синхронизацию не костылями, а проверенными методами. Кто спорит? Но так же говорю, что можно (я не выставляю это как какую-то безоговорочную истину) реализовать синхронизацию своими руками.
Не смущает что "правильно" и "можно", взаимоисключающие понятия ?
Можно вообще синхронизацию не делать пусть падает приложение... пользователь всегда сможет его еще раз запустить...
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
20.02.2014, 16:22
Цитата Сообщение от Avazart Посмотреть сообщение
bool не атомарный тип данных
Атомарность важна при работе с многобайтовыми перенными. Например флоат. Пока второй поток читает 4 байта, первый поток может изменить их. Т.е. второй поток может получить первые 2 байта от одного числа вторые 2 байта от другого числа, и как результат получит треть число. У нас переменная bool, т.е. занимает 1 байт. И даже в этот байте нас интерисует только 1 бит, 0 он или 1. Изменить 1 бит в процессе его чтения на другое значение, чтобы получилось треть значение бита не реально. Чем это не атомарность?
Цитата Сообщение от Avazart Посмотреть сообщение
Про "кручения в цикле" вообще молчу ...
Я же сразу сказал, что это проблема. Но если флаг меняется не часто, то вставляем в цикл Sleep(1) и все нормально.
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Но так же говорю, что можно (я не выставляю это как какую-то безоговорочную истину) реализовать синхронизацию своими руками.
Нормально нельзя. В дом можно и через окно залезть, но это не нормально.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.02.2014, 16:25
Цитата Сообщение от gumi250 Посмотреть сообщение
Атомарность важна при работе с многобайтовыми перенными. Например флоат. Пока второй поток читает 4 байта,
Цитата Сообщение от gumi250 Посмотреть сообщение
У нас переменная bool, т.е. занимает 1 байт.
Так а какие гарантии что bool не реализован через int ?
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
20.02.2014, 16:31
Цитата Сообщение от Avazart Посмотреть сообщение
Так а какие гарантии что bool не реализован через int ?
1. Нам все равно нужен только один бит. Остальные биты будут нулями, т.к. ничто иное в них не пишут, да мы их и не смотрим.
2. Можно взять BYTE, и смотреть в нем 1 бит.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.02.2014, 16:39
Ну так сегодня нам нужен один бит, завтра два итд.

Цитата Сообщение от gumi250 Посмотреть сообщение
2. Можно взять BYTE, и смотреть в нем 1 бит.
Уверен ?
С++ нет такого типа данных...
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
20.02.2014, 16:43
В билдере есть. Это ведь форум билдера. Можно char сути это не меняет.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.02.2014, 17:02
Цитата Сообщение от gumi250 Посмотреть сообщение
В билдере есть. Это ведь форум билдера. Можно char сути это не меняет.
Уверен? Билдер что не в плюсовом разделе находится?
BYTE это скорее typedef какого нибудь плюсового типа, в XE3 это:
C++
1
typedef unsigned char       BYTE;
Но не факт что в другой среде будет другой тип данных и соответственно нежданчик...

Но допустим проехали этот момент... возьмемся за другой ...
Кто гарантирует что ваш char не оптимизируется компилятором и вы не получите "чудо-сюрприз" ?

http://mainloop.ru/c-language/... atile.html

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

Так спрашивается стоит ли так извращаться? или проще сразу отмести такой ручной вариант и использовать стандартные, предусмотренные для этого подходы?

Добавлено через 6 минут
Что касается флагов, то как пишут можно полагаться на атомарность:
C++
1
volatile unsigned char
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.02.2014, 17:02
Помогаю со студенческими работами здесь

Обмен данными между C++ Builder и Java компонентами socket-ов
Всем доброго времени суток. Не знаю, следует-ли создавать эту тему именно в данном разделе, т.к. она затрагивает как C++ Builder так и...

Обмен данными по сети интернет
Возник такой вопрос, каким образом можно оганизовать обмен данными между двумя программами по сети интернет, обмен нужен в обе стороны....

ServerSocket и ClientSocket обмен данными
Подскажите как обмен данными идет через SendText и ReceiveText в данных компонентах (ServerSocket и ClientSocket). А то посылаю с клиента...

Обмен данными через COM порт
Доброго времени суток. Требуется производить обмен данными с неким устройством через СОМ порт. Сейчас использую вот такие функции: ...

Обмен данными через интернет
Доброго времени суток!!! При помощи чего реализовать обмен данными между компьютерами через интернет?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru