Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Обмен сообщениями между классами  (Прочитано 11684 раз)
0 Пользователей и 1 Гость смотрят эту тему.
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« : 06-11-2004 10:47 » new

Что-то у меня путаница с сообщениями...
Вот объясните - обмениваться сообщениями могут любые классы или только оконные?
Если любые - то как мне послать асинхронное сообщение от одного класса другому?
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 06-11-2004 11:04 » 

сообщениями WINDOWS - только оконные (от CWnd)

а какие ты имеешь в виду сообщения?
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 06-11-2004 11:33 » 

baldr, Если твои классы будут сидеть в разных потоках, то это имеет смысл. А если в одном потоке, тогда я не вижу смысла. Легче делать прямой вызов.
Для разных потоков нужно организовать буффер сообшений. Каждый поток опрашивает этот буфер. Если для класса в потоке есть сообшение, оно отрабатывается, иначе происходит засыпание до следуешего раза.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #3 : 06-11-2004 13:50 » 

У меня отрабатывается вызов таймера. Таймер высокочастотный (от 200 герц и выше). При каждом тике мне надо передавать данные другому классу, который будет их записывать или делать что-то еще. Но если делать прямой вызов функции, то обработчик таймера будет ждать возврата. Я хочу, чтобы обработчик быстро кинул куда-нибудь данные и работал дальше.
Как это сделать? Данные должны обрабатываться примерно в то же время, как и поступают.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #4 : 06-11-2004 14:01 » 

Как вариант для сообщений: можно отнаследовать оба класса от CCmdTarget. тогда будут доступны сообщения...
Но как в таком случае обмениваться сообщениями? У меня опыта с ними никакого.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 06-11-2004 14:29 » 

baldr, Посади их на разные потоки. Сделай чтобы сразу два класса видели область данных. В области данных сделай переменную-флаг, если флаг поднят, то данные изменены, и требуют записи. Если отпушен, то в области старые данные. Теперь поток таймера изменяет данные и поднимает флаг. поток обработки отрабатывает данные и отпускает флаг. Здесь есть одно но. Отработка данных должна происходить быстрее, чем вызов таймера. Иначе возможно потеря данных. Конечно можно делать буферезацию, но там тоже возможно переполнение.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #6 : 06-11-2004 14:49 » 

Finch, я боялся, что кто-нибудь и предложит такой вариант.  Отлично
Нет. Это совершенно недопустимо.
Чем хороша очередь сообщений - это асинхронностью обработки.
Буфер:
а) может переполниться.
б) вообще неправильно с точки зрения OOD делать такой общий доступ к одним и тем же данным.
Уж лучше я буду напрямую вызывать функцию, чем буду делать буфер.
Тем более, что читать из буфера, как ты предлагаешь, надо еще с одним таким же таймером.  :new_shot:  Это ж надо будет их синхронизировать, да сколько ресурсов они обабудут жрать??  :new_shot:  :new_shot:
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 06-11-2004 18:46 » 

baldr, Вообше то чисто теоретически очередь сообшений и есть буфер.
И поток делает постоянный опрос этого буфера. Как только пришло сообшение, идет его обработка, в противном случае поток засыпает. О возобновлении работы потока заботится Виндовс сам. И тут не нужно ставить ни таймер и ни отдавать кучу ресурсов. У тебя чуть не тревиальная задача и "правильные решения" могут не работать.
Сделай свои данные закрытыми в одном хэдэрэ и их кроме тебя никто видеть и не будет.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 06-11-2004 20:04 » 

baldr, коли ты юзишь таймер...
 (да ещё и совершенно не высокочастотный - самый завалящий проц, скажем 300MГц , сумеет за один тик частотой 200Гц сделать 1500000 операций.)
... коли ты используешь таймер - значит операции у тебя синхронные - как же ещё? Если представить один тик в виде отрезка, то в начале каждого начинается очередная операция обработки - например получение данных, обработка, начало_нового_измерения_или_что_там_у_тебя_происходит , или вообще простой, в течение которого можно фоновые операции выполнять.
А если несинхронизированные операции - тогда зачем таймер? Правильно Финч говорит - выполнил одну операцию, приступай к ожиланию/выполнению следующей, а если проц не способен переварить за это время - будет потеря данных или тормоз времени
Записан

Serega
Гость
« Ответ #9 : 06-11-2004 21:41 » 

Бери обычную очередь (мне std:deque нравится)
синхронизировать можно с помощью Readers-Writers Lock или просто мутекс и выгребать сразу всю очередь на обработку (у тебя наверно какраз так)

to Алексей1153, не все так просто, система многозадачная и когда она вдруг решит переключить процесс не известно
Если таймер нормальный (а не WM_TIMER) то он будет срабатывать с приемлемым запаздыванием, а вот что для обработки система даст достаточно процесорного времени это не факт
любая не примитавная обработка включает в себя работу с устройствами или каналами передачи или хранения данных, а это самое время для переключения процессов, т.к. обычно это происходит асинхронно
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 07-11-2004 05:58 » 

Serega, насчёт загрузки системы - ну так предполагается, что если машина предназначена для сверх-точных скоростных вычислений , то она одновременно не должна форматированть винты ещё пяти компов, соединённых по сети Улыбаюсь

вот я сейчас делаю прогу - там прибор принимает из эфира инфу ПОСТОЯННО и скидвает на комп - а я её перевариваю, сохраняю , много обработки и вывожу на экран. Читаю и сохраняю как только приходит, а обрабатываю по таймеру в секунду
Записан

Diletant
Помогающий

de
Offline Offline

« Ответ #11 : 08-11-2004 08:02 » 

Подобные обработки очень душевно осуществляются с набором очередь  плюс семафор. В отличие от Серегиного варианта с мьютексом можно обрабатывать очередь по частям.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines