threads intercommunnication - как сделать?
От: sjukov Украина  
Дата: 16.11.06 21:46
Оценка:
Коллеги! посоветуйте пожалуйста как лучше всего сделать связь между
несколькими потоками одного процесса? я знаю что есть
1. иенованные каналы
2. мэйл слоты
3. message (wm_copydata)
и т.д..
но как-то это все никузяво....

Слышал что есь библиотека boost::signal но что там и до чего еще не разбирался.

Мне надо по сути уведомлять один из потоков о сыбытиях в других потоках и в ответ на это событие
отсылать команды обратно — "указания" что нужно делать дальше.


Спасибо. буду благодарен за любые мысли.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: threads intercommunnication - как сделать?
От: Аноним  
Дата: 16.11.06 23:00
Оценка:
Можно так:
— оповещать другой поток о события с помощью event'ов
— использовать общий для нескольких потоков пул данных для обмена данными.
В самом простом и нежелательном случае — это просто глобальные данные.
Доступ к таким данным не забывать синхронихировать с помощью мьютексов (критических секций).

Можешь еще посмотреть что есть в boost на этот случай.
Там минимальный, но достаточный набор примитивов для многопоточного программирования.
Re: threads intercommunnication - как сделать?
От: Analitic Россия  
Дата: 21.11.06 07:52
Оценка: -1
Здравствуйте, sjukov, Вы писали:

S>Спасибо. буду благодарен за любые мысли.

Если потоков не так много, то можно cоздать скрытое окно в потоке, и работать уже как с окнами, — посылая сообщения от окна — к окну.
Учиться, учиться и еще раз учиться...
Re[2]: threads intercommunnication - как сделать?
От: Аноним  
Дата: 21.11.06 07:55
Оценка:
Здравствуйте, Analitic, Вы писали:

A>Здравствуйте, sjukov, Вы писали:


S>>Спасибо. буду благодарен за любые мысли.

A>Если потоков не так много, то можно cоздать скрытое окно в потоке, и работать уже как с окнами, — посылая сообщения от окна — к окну.

Непереносимое, заточеное под винду решение.
Я бы рекомендовал его в крайнем случае тем,
у кого нету опыта многопоточного программирования...
Re: threads intercommunnication - как сделать?
От: Кодт Россия  
Дата: 21.11.06 11:46
Оценка:
Здравствуйте, sjukov, Вы писали:

S>Коллеги! посоветуйте пожалуйста как лучше всего сделать связь между

S>несколькими потоками одного процесса? я знаю что есть
S>1. именованные каналы

можно и безымянные. В пределах одного процесса-то...

S>2. мэйл слоты

S>3. message (wm_copydata)
S>и т.д..
S>но как-то это все никузяво....

S>Мне надо по сути уведомлять один из потоков о сыбытиях в других потоках и в ответ на это событие

S>отсылать команды обратно — "указания" что нужно делать дальше.

А какого рода указания? Насколько асинхронно всё это происходит, могут ли возникать очереди сообщений (кстати, о message queue!) или достаточно рандеву вокруг разделяемых данных?
Распиши сценарии, а потом под это дело придумаем решение.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: threads intercommunnication - как сделать?
От: sjukov Украина  
Дата: 21.11.06 18:57
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, sjukov, Вы писали:


S>>Коллеги! посоветуйте пожалуйста как лучше всего сделать связь между

S>>несколькими потоками одного процесса? я знаю что есть
S>>1. именованные каналы

К>можно и безымянные. В пределах одного процесса-то...


S>>2. мэйл слоты

S>>3. message (wm_copydata)
S>>и т.д..
S>>но как-то это все никузяво....

S>>Мне надо по сути уведомлять один из потоков о сыбытиях в других потоках и в ответ на это событие

S>>отсылать команды обратно — "указания" что нужно делать дальше.

К>А какого рода указания?

Рабочий поток постоянно читает что-то с com-порта(at команды gsm модема — на факт наличия входщих непрочитанных СМС). При считывания валидной строки с порта ,поток отсылает уведомление в главный поток приложения... приложение должно передать прочитанную
иформацию в другой поток , который запишет принятое СМС В БД (ms sql) Если все прошло без ошибок, то передается управление опять "читальщику"
с ком порта, где уже посылается at команда на удаление принятого СМС. чтобы не засорять память.

По идее лучше это сделать в виде "разделямых данных". т.к. важно чтобы смс удалялось только в том случае когда
запись окажется в БД(система дистанционного управления городского освещения(когда из автоматического режима нужно перейти в ручной для
управления с главного ПК)) — инофрмация важная

,.. хотя возможно я не совсем выкупил фишку с очередями

К>Насколько асинхронно всё это происходит, могут ли возникать очереди сообщений (кстати, о message queue!) или достаточно рандеву вокруг разделяемых данных?

К>Распиши сценарии, а потом под это дело придумаем решение.

По идее обработка следующего смс не наступит ранее как будет обработано предыдущее — записано в БД и стерто с
SIM карты.


Возможно я не совсем верно продумал "архитектуру", если это так можно назвать
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: threads intercommunnication - как сделать?
От: Quasi  
Дата: 21.11.06 19:24
Оценка:
Здравствуйте, sjukov, Вы писали:

S>Здравствуйте, Кодт, Вы писали:


К>>Здравствуйте, sjukov, Вы писали:


S>>>Коллеги! посоветуйте пожалуйста как лучше всего сделать связь между

S>>>несколькими потоками одного процесса? я знаю что есть
S>>>1. именованные каналы

К>>можно и безымянные. В пределах одного процесса-то...


S>>>2. мэйл слоты

S>>>3. message (wm_copydata)
S>>>и т.д..
S>>>но как-то это все никузяво....

S>>>Мне надо по сути уведомлять один из потоков о сыбытиях в других потоках и в ответ на это событие

S>>>отсылать команды обратно — "указания" что нужно делать дальше.

К>>А какого рода указания?

S>Рабочий поток постоянно читает что-то с com-порта(at команды gsm модема — на факт наличия входщих непрочитанных СМС). При считывания валидной строки с порта ,поток отсылает уведомление в главный поток приложения... приложение должно передать прочитанную
S>иформацию в другой поток , который запишет принятое СМС В БД (ms sql) Если все прошло без ошибок, то передается управление опять "читальщику"
S>с ком порта, где уже посылается at команда на удаление принятого СМС. чтобы не засорять память.

S>По идее лучше это сделать в виде "разделямых данных". т.к. важно чтобы смс удалялось только в том случае когда

S>запись окажется в БД(система дистанционного управления городского освещения(когда из автоматического режима нужно перейти в ручной для
S>управления с главного ПК)) — инофрмация важная

S>,.. хотя возможно я не совсем выкупил фишку с очередями


К>>Насколько асинхронно всё это происходит, могут ли возникать очереди сообщений (кстати, о message queue!) или достаточно рандеву вокруг разделяемых данных?

К>>Распиши сценарии, а потом под это дело придумаем решение.

S>По идее обработка следующего смс не наступит ранее как будет обработано предыдущее — записано в БД и стерто с

S>SIM карты.
Тогда не совсем понятно зачем нужно несколько потоков для решения задачи, какие бонусы?

S>Возможно я не совсем верно продумал "архитектуру", если это так можно назвать
Re[4]: threads intercommunnication - как сделать?
От: sjukov Украина  
Дата: 21.11.06 19:52
Оценка: :)))
Здравствуйте, Quasi, Вы писали:


S>>По идее обработка следующего смс не наступит ранее как будет обработано предыдущее — записано в БД и стерто с

S>>SIM карты.
Q>Тогда не совсем понятно зачем нужно несколько потоков для решения задачи, какие бонусы?
Исхожу из мысли что один модуль делает ОДНО свое дело. Легче отладку вести.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: threads intercommunnication - как сделать?
От: Quasi  
Дата: 21.11.06 20:06
Оценка:
Здравствуйте, sjukov, Вы писали:

S>Здравствуйте, Quasi, Вы писали:



S>>>По идее обработка следующего смс не наступит ранее как будет обработано предыдущее — записано в БД и стерто с

S>>>SIM карты.
Q>>Тогда не совсем понятно зачем нужно несколько потоков для решения задачи, какие бонусы?
S>Исхожу из мысли что один модуль делает ОДНО свое дело. Легче отладку вести.
Модульность и многопоточность суть ортогональные вещи. А использование нескольких потоков там, где это абсолютно не нужно, только усложняет реализацию.
Re[3]: threads intercommunnication - как сделать?
От: srggal Украина  
Дата: 22.11.06 11:36
Оценка: 2 (1)
Здравствуйте, sjukov, Вы писали:

Ваше описание довольно хорошо подходит под пример из ACE для Streams см. в дистрибутиве ACE ACE_wrappers\examples\APG\Streams.

Кстати Streams и предназначен для того, чтобы

модуль делает ОДНО свое дело

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: threads intercommunnication - как сделать?
От: sjukov Украина  
Дата: 23.11.06 06:19
Оценка:
Здравствуйте, srggal, Вы писали:

S>Здравствуйте, sjukov, Вы писали:


S>Ваше описание довольно хорошо подходит под пример из ACE для Streams см. в дистрибутиве ACE ACE_wrappers\examples\APG\Streams.


S>Кстати Streams и предназначен для того, чтобы


А не подскажешь что такое ACE и где домашняя страничка этого проекта?.
А то я что-то набрел на что-то не то
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: threads intercommunnication - как сделать?
От: Mazay Россия  
Дата: 23.11.06 08:35
Оценка: 2 (1)
Здравствуйте, sjukov, Вы писали:

S>А не подскажешь что такое ACE и где домашняя страничка этого проекта?.

S>А то я что-то набрел на что-то не то

Вот кажись: http://www.cs.wustl.edu/~schmidt/ACE.html
Главное гармония ...
Re[3]: threads intercommunnication - как сделать?
От: Mazay Россия  
Дата: 23.11.06 08:42
Оценка:
Здравствуйте, Аноним, Вы писали:

S>>>Спасибо. буду благодарен за любые мысли.

A>>Если потоков не так много, то можно cоздать скрытое окно в потоке, и работать уже как с окнами, — посылая сообщения от окна — к окну.

А>Непереносимое, заточеное под винду решение.

А>Я бы рекомендовал его в крайнем случае тем,
А>у кого нету опыта многопоточного программирования...

А какие переносимые средства для многопоточного программирования ты знаешь? Поделись информацией. Максимум что мне приходит в голову — это высокоуровневые обёртки типа boost или ACE.

ЗЫ.
Но создавать окно для межпроцесного взаимодействия — это конечно изврат по-любому.
Главное гармония ...
Re[5]: threads intercommunnication - как сделать?
От: srggal Украина  
Дата: 23.11.06 12:24
Оценка:
Здравствуйте, sjukov, Вы писали:

S>Здравствуйте, srggal, Вы писали:


S>>Здравствуйте, sjukov, Вы писали:


S>>Ваше описание довольно хорошо подходит под пример из ACE для Streams см. в дистрибутиве ACE ACE_wrappers\examples\APG\Streams.


S>>Кстати Streams и предназначен для того, чтобы


S>А не подскажешь что такое ACE и где домашняя страничка этого проекта?.

S>А то я что-то набрел на что-то не то

ACE это такая кросплатформенная либа здесь
Автор: eao197
Дата: 02.02.06

А линк на страничку — уже дали.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: threads intercommunnication - как сделать?
От: srggal Украина  
Дата: 23.11.06 12:26
Оценка: 2 (1)
Здравствуйте, Mazay, Вы писали:


M>А какие переносимые средства для многопоточного программирования ты знаешь? Поделись информацией. Максимум что мне приходит в голову — это высокоуровневые обёртки типа boost или ACE.


M>ЗЫ.

M>Но создавать окно для межпроцесного взаимодействия — это конечно изврат по-любому.

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

PostThreadMessage
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: threads intercommunnication - как сделать?
От: MaximE Великобритания  
Дата: 25.11.06 09:59
Оценка: 3 (1)
sjukov wrote:

[]

> К>А какого рода указания?

> Рабочий поток постоянно читает что-то с com-порта(at команды gsm модема
> — на факт наличия входщих непрочитанных СМС). При считывания валидной
> строки с порта ,поток отсылает уведомление в главный поток приложения...
> приложение должно передать прочитанную
> иформацию в другой поток , который запишет принятое СМС В БД (ms sql)
> Если все прошло без ошибок, то передается управление опять "читальщику"
> с ком порта, где уже посылается at команда на удаление принятого СМС.
> чтобы не засорять память.
>
> По идее лучше это сделать в виде "разделямых данных". т.к. важно чтобы
> смс удалялось только в том случае когда
> запись окажется в БД(система дистанционного управления городского
> освещения(когда из автоматического режима нужно перейти в ручной для
> управления с главного ПК)) — инофрмация важная
>
> ,.. хотя возможно я не совсем выкупил фишку с очередями
>
> К>Насколько асинхронно всё это происходит, могут ли возникать очереди
> сообщений (кстати, о message queue!) или достаточно рандеву вокруг
> разделяемых данных?
> К>Распиши сценарии, а потом под это дело придумаем решение.
>
> По идее обработка следующего смс не наступит ранее как будет обработано
> предыдущее — записано в БД и стерто с
> SIM карты.
>
>
> Возможно я не совсем верно продумал "архитектуру", если это так можно
> назвать

Возможно есть простое решение. Например такое:

Однопоточное приложение читает sms с com-port'a и записывает их в текстовом
формате в stdout. Если запись в stdout прошла успешно, в com-port посылается
команда удаления sms с устройства.

Другое однопоточное приложение, а лучше скрипт (bash/awk/python/perl/whatever),
читает и парсит stdin. При получение нового сообщения скрипт записывает его в
базу данных.

В итоге, твоя система будет запускаться так:

$ read-sms <options> | tee sms.backup | write-sms-to-db <options>[code]

tee sms.backup здесь нужен для надежности - если write-sms-to-db не смог 
записать sms в db, то они все равно остаются в файле sms.backup, так что их 
можно записать в db позднее командой:

[code]write-sms-to-db <options> < sms.backup


Заметь, приложения однопоточные, простые. Каждое приложение занимается только
одной задачей и может вызываться отдельно от другого. Просто и гибко.

--
Maxim Yegorushkin

No Microsoft product was used in any way to write or send this text.
If you use a Microsoft product to read it, you're doing so at your own risk
Posted via RSDN NNTP Server 2.0
Re[4]: threads intercommunnication - как сделать?
От: sjukov Украина  
Дата: 25.11.06 16:26
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>sjukov wrote:

>>
>> По идее обработка следующего смс не наступит ранее как будет обработано
>> предыдущее — записано в БД и стерто с
>> SIM карты.
>>

ME>Возможно есть простое решение. Например такое:

ME>Однопоточное приложение читает sms с com-port'a и записывает их в текстовом
ME>формате в stdout. Если запись в stdout прошла успешно, в com-port посылается
ME>команда удаления sms с устройства.

[skip]
ME>
write-sms-to-db <options> < sms.backup


ME>Заметь, приложения однопоточные, простые. Каждое приложение занимается только

ME>одной задачей и может вызываться отдельно от другого. Просто и гибко.

[skip]

Ух ты! "Юникс" просто таки получается!
И в самом деле изящное решение.

Скорее всего воспользуюсь такой схемой:
python writetodb.py | smsd.exe


правда всетаки надо придумать как сделать "обратній канал" из скрипта в "демон".

Спасибо за идею.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: threads intercommunnication - как сделать?
От: sjukov Украина  
Дата: 25.11.06 16:26
Оценка:
Здравствуйте, srggal, Вы писали:

S>Здравствуйте, sjukov, Вы писали:


S>Ваше описание довольно хорошо подходит под пример из ACE для Streams см. в дистрибутиве ACE ACE_wrappers\examples\APG\Streams.


S>Кстати Streams и предназначен для того, чтобы


S>

S>модуль делает ОДНО свое дело


Спасибо за наводку! но что-то мне подсказывает что в той библиотеке без поллитры не разберешься
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: threads intercommunnication - как сделать?
От: MaximE Великобритания  
Дата: 25.11.06 17:21
Оценка:
Здравствуйте, sjukov, Вы писали:

S>Здравствуйте, MaximE, Вы писали:


ME>>sjukov wrote:

>>>
>>> По идее обработка следующего смс не наступит ранее как будет обработано
>>> предыдущее — записано в БД и стерто с
>>> SIM карты.
>>>

ME>>Возможно есть простое решение. Например такое:

ME>>Однопоточное приложение читает sms с com-port'a и записывает их в текстовом
ME>>формате в stdout. Если запись в stdout прошла успешно, в com-port посылается
ME>>команда удаления sms с устройства.

S>[skip]

ME>>
write-sms-to-db <options> < sms.backup


ME>>Заметь, приложения однопоточные, простые. Каждое приложение занимается только

ME>>одной задачей и может вызываться отдельно от другого. Просто и гибко.

S>[skip]


S>Ух ты! "Юникс" просто таки получается!

S>И в самом деле изящное решение.

Приятно, что ты уловил "дух" решения. Действительно, оно основано на unix принципах:

http://catb.org/esr/writings/taoup/html/ch01s06.html#id2877684

Rule of Composition: Design programs to be connected with other programs.

It's hard to avoid programming overcomplicated monoliths if none of your programs can talk to each other.

Unix tradition strongly encourages writing programs that read and write simple, textual, stream-oriented, device-independent formats. Under classic Unix, as many programs as possible are written as simple filters, which take a simple text stream on input and process it into another simple text stream on output.

Despite popular mythology, this practice is favored not because Unix programmers hate graphical user interfaces. It's because if you don't write programs that accept and emit simple text streams, it's much more difficult to hook the programs together.

Text streams are to Unix tools as messages are to objects in an object-oriented setting. The simplicity of the text-stream interface enforces the encapsulation of the tools. More elaborate forms of inter-process communication, such as remote procedure calls, show a tendency to involve programs with each others' internals too much.

To make programs composable, make them independent. A program on one end of a text stream should care as little as possible about the program on the other end. It should be made easy to replace one end with a completely different implementation without disturbing the other.

GUIs can be a very good thing. Complex binary data formats are sometimes unavoidable by any reasonable means. But before writing a GUI, it's wise to ask if the tricky interactive parts of your program can be segregated into one piece and the workhorse algorithms into another, with a simple command stream or application protocol connecting the two. Before devising a tricky binary format to pass data around, it's worth experimenting to see if you can make a simple textual format work and accept a little parsing overhead in return for being able to hack the data stream with general-purpose tools.

When a serialized, protocol-like interface is not natural for the application, proper Unix design is to at least organize as many of the application primitives as possible into a library with a well-defined API. This opens up the possibility that the application can be called by linkage, or that multiple interfaces can be glued on it for different�tasks.


S>Скорее всего воспользуюсь такой схемой:

S>python writetodb.py | smsd.exe

Может smsd.exe | writetodb.py ?

S>правда всетаки надо придумать как сделать "обратній канал" из скрипта в "демон".


Интересно, для чего обратный канал?
Re[6]: threads intercommunnication - как сделать?
От: sjukov Украина  
Дата: 25.11.06 18:28
Оценка:
Здравствуйте, MaximE, Вы писали:

S>>Скорее всего воспользуюсь такой схемой:

S>>python writetodb.py | smsd.exe

ME>Может smsd.exe | writetodb.py ?

скорее всего. я в "пайпах" немного путаюсь

S>>правда всетаки надо придумать как сделать "обратній канал" из скрипта в "демон".


ME>Интересно, для чего обратный канал?

Я забыл написать что помимо того что необходимо читать sms, их вообщето надо еще
и отправлять. это интерактивная система. Не получится открыть 2 программам один и тот же com порт
(одна чтобы читала входящие смс, а другая чтобы писала).
Поэтому писать надо в том же "месте" где и читать — поэтому нужна как-бы "full duplex" связь
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.