Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Взаимодействие потоков, see subj 
:(
    Опции темы
jonie
Дата 24.7.2007, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



итак, возникла незначительная проблема с выбором метода...
имеется : головной модуль - окно с менюшкой. грузит субмодули. Каждый субмодуль может при регистрировании добавить к окошку головного модуля свою субменюшку. И каждый субмодуль стартует свою Thread обработки чего-то (окон не имеет своих).
Вопросы : 
1)как обеспечить взаимодействие "сверху вниз" (по щелчку на менюшке, зарегиной субмодулем, чтобы этот субмодуль реагировал)
2)как обеспечить взаимодействие "снизу-вверх" (чтобы головной модуль мог реагировать на ситуации в субмодулях)..

Если с (2) еще более-менее понятно  (PostMessage (?) ) , то вот с первым чет не очень...

Дополнительные условия: 
1)в субмодулях окон нет
2)"тормозить" головной модуль крайне нежелательно
3)когда произойдет обработка события в субмодуле и как долго она будет идти неизветно (т.е. вызов просто CALLBACK субмодуля не очень подходит)....


Пока из вариантов пришел к одному:
1)субмодуль регистрирует Event-ы , которые ассоциируеются в головном модуле с менюшками.
2)при шелчке голвной модуль ставит event
3)субмодуль ожидает в своей ветке WaitForMultiplyEvents() и позже выбирает какой эвен стоит (если вообще стоит). Кстати, как такое грамотно реализуется (выбор что стоит)?

мб кто че расскажет про PostThreadMessage ? Чет мне думается это лучше чем Wait* функции? (ожидается что субмодули будут некторое время "спать", регулярно)...

Пните чтоли в какую сторону лететь или как такие вещи грамотно делаются...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
takedo
Дата 24.7.2007, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

Репутация: -1
Всего: 3



по моему с эвентами нормально


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Earnest
Дата 24.7.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(jonie @  24.7.2007,  01:33 Найти цитируемый пост)
про PostThreadMessage 

для рабочих потоков не годится: нужен цикл обработки сообщений.

Я бы регистрировала при добавлении менюшек не ивенты (как-то это слишком), а указатели объекты-агенты с заданным интерфейсом (virtual void OnCommand (UINT ID)), которым бы посылала команды, выбранные из меню.
Требования по быстрой обработке (т.е. быстрому возврату из OnCommand) я бы повесила на суб-модули (скажем, запустим поток и быстренько вернемся). А может, что-то совсем простое нужно сделать.
Кроме прочего, такой подход позволяет добавить агенту функцию OnUpdate, чтобы обновлять пункты меню согласно текущей ситуации, что часто не лишне.

Обрабтная связь (от суб-модуля к главному) - через сообщения, можно и через PostThreadMessage, но проще посылать главному окну.
А ивенты и прочая синхронизация - пусть будут локальными в каждом субмодуле (что, конечно, не исключает использования общего базового кода).

Добавлено через 3 минуты и 46 секунд
При таком подходе суб-модуль может стартовать поток сразу после регистрации и ждать чего-то (что выставит соответсвующий OnCommand в главном потоке) или запускать поток для каждой новой команды, в зависимости от выполняемых задач. И насчет обновления: скажем, пока обсчитывается какая-то задача (поток работает) можно дизэблить соответсвующую команду, что выглядит вполне разумно. 


--------------------
...
PM   Вверх
jonie
Дата 24.7.2007, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Цитата

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

Цитата

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

Цитата

для рабочих потоков не годится: нужен цикл обработки сообщений.
блокируется поток при ожидании сообщения потокового или как-то можно установить макс время ожидания сообщения (как скажем для функций Wait*) ?....просвятите плс...

Просто хотелось бы иметь очередь "что предназначено субмодулю".. можно, конечно, заносить в свою в главном потоке.... но тут вроде как системная , готовая)....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Pulse69
Дата 25.7.2007, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 28.4.2006
Где: Хабаровск

Репутация: 8
Всего: 10



Цитата(jonie @  24.7.2007,  22:23 Найти цитируемый пост)
кто их создает немного непонял(...если создать их во время регистрации субмодуля то они окажутся в главном потоке созданы (поток субмодуля еще не создан), проблема взаимодействия их с потоком субмодуля останется, разве нет?

Такой интерфейс должен создаваться субмодулем. Главный модуль будет знать только набор виртуальных методов, а их реализация ляжет на субмодули. 
К примеру, создаётся такой класс

Код

class IPlugin
{
public: virtual void onCommand( UINT CommandID ) = 0;
};



Его описание будет доступно в главном модуле и в субмодуле.
Теперь в субмодуле пишется производный класс
Код

class Plugin: public IPlugin
{
public: 
    Plugin( void* params )
    {
    }

    virtual void onCommand( UINT CommandID )
    {
    }
};


В субмодуле будет функция типа
Код

IPlugin* InitializeModule( void* params )
{
     return dynamic_cast<IPlugin*>( new Plugin( params ) );
}


которая создаст экземпляр реализующего класса.

Сама реализация функции onCommand не должна занимать много времени, как уже сказала Earnest.
Например, класс Plugin после создание (в конструкторе) запускает поток и регистрирует внутренний Event для сообщений этому потоку, а реализация onCommand просто сохраняет ID команды и выставляет этот Event.

--------------------
Ctrl+Alt+Reset 
PM MAIL   Вверх
Earnest
Дата 25.7.2007, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Да, Pulse69 все верно написал. Объект создает суб-модуль, конечно, ибо только он знает его истинную реализацию, и в главном потоке. И неважно, в каком потоке что создано. Если нужно синхронизировать доступ к каким-то данным, то есть простые средства вроде критической секции. 

Для того, чтобы иметь в субмодуле очередь, нужно создавать интерфейсный поток с очередьюсообщений. Рабочий поток, где просто функция крутится, такой очередью не обладает. Ну нечем ему сообщения принимать. Он целиком состоит из той функции, которую ты передал во время создания потока, и другого кода там, считай, нет.

Ну раз не надо тебе дизэблить менюшки, так и ладно. Значит, получается, что надо обеспечить возможность запуска второго потока на обсчет хотя первый еще не закончил. Т.е. субмодуль должен состоять из кода, работающего в главном потоке (получающего команды меню, тот самый OnCommand)  и управляющего созданными потоками, и самих потоков.


--------------------
...
PM   Вверх
Debugg3R
Дата 25.7.2007, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 8.1.2007
Где: Алтайский край

Репутация: нет
Всего: нет



Можно использовать механизм типа "Семафор". А для передачи данных  "Канал"
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0970 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.