Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Сообщение из потока


Автор: Gwendolen 12.8.2008, 20:03
Проектирую структуру кросплатформенного (Windows и Linux) многопоточного приложения.
С программированием под Linux знаком мало (работал только с QT под обоими платформами).

Собственно задача:
Необходимо посылать сообщения из функций, находящихся в динамических библиотеках (поток для них создает исполняемый файл).

Если бы писал только под Windows то было бы оптимально PostThreadMessage или Post/SendMessage и цикл обработки сообщений потока/окна.
Пока только приходит в голову callback функция в исполняемом файле, которая помещает данные сообщения в потокобезопасный контейнер и генерирует собщение, что его в контейнере есть данные. Так как она находится в исполняемом файле то смело можно использовать сообщения QT, на котором я планирую создавать интерфейс.

P.S. Желательно также, чтобы метод позволял разрабатывать динамические библиотеки не только на С.

Автор: SABROG 12.8.2008, 22:02
Qt вполне позволяет соединять сигналы со слотами из других потоков:

Цитата

Each QThread can have its own event loop. You can start the event loop by calling exec(); you can stop it by calling exit() or quit(). Having an event loop in a thread makes it possible to connect signals from other threads to slots in this threads, using a mechanism called queued connections. It also makes it possible to use classes that require the event loop, such as QTimer and QTcpSocket, in the thread. Note, however, that is is not possible to use any widget classes in the thread. 

Автор: Gwendolen 13.8.2008, 00:03
Цитата(SABROG @  12.8.2008,  22:02 Найти цитируемый пост)
Qt вполне позволяет соединять сигналы со слотами из других потоков

Отлично это знаю, а если динамическая библиотека разрабатывается на другом языке (например Delphi). Так как библиотеки планируется применять как модули расширения - плугины.
Надо чтото более универсальное, хотябы с использованием стандартной библиотеки С++.

Автор: Alek86 13.8.2008, 10:11
удалено

Автор: Cycle 13.8.2008, 14:21
Универсальное? А что есть и в Линуксе и Виндовс? 
Например socks. Правда при работе с socks все равно придется некоторые участки кода обрамлять в  #ifdef WIN32

Автор: Alek86 13.8.2008, 15:04
если длл может писаться на любом языке и под любые платформы, то подойдет только общая технология типа COM (не знаю. правда. как он реализуется под линухом) или .Net

Автор: Ulysses4j 13.8.2008, 15:30
Gwendolen, вопрос я понял плохо. Могу сказать, что во-первых, надо понять, что бинарной переносимости между win32 и linux нет, и ничто это не исправит: нужно делать разные сборки под разные платформы. Переносимости на уровне исходных кодов можно добиться за счет использования библиотек (Boost, в частности, его потоковая библиотека, Qt, wxWidgets...). 

Если вы создаете распределенное приложение, часть которого выполняется на одной платформе, часть на другой, то взаимодействие между ними можно организовывать традиционными средстванми: сокеты, ICE, недавно опубликованная Google Protocol Buffers из бинарных или XML-RPC, web servicies из текстовых. 

COM и CORBA, если ничто извне не вынуждает их использовать, это оверкил: очень сложные, поддержка есть только для COM под Windows, в остальных сочетаниях вам придется довольно тяжко (хотя и в случае COM под win32 все тоже тяжко). Ничего особо эксклюзивного они сами по себе не представляют (имеет смысл использовать, повторю, если есть уже что-то на них написанное).

Автор: Gwendolen 13.8.2008, 19:16
Цитата(Ulysses4j @  13.8.2008,  15:30 Найти цитируемый пост)
бинарной переносимости между win32 и linux нет

Бинарная переносимость не требуется, требуется максимально возможная переносимость кода.

Похоже код, прийдется разделять и для потправки сообщений использовать API конкретной ОС (не обработку сообщений с помощью каких либо библиотек).

Автор: Ulysses4j 13.8.2008, 19:28
Если спользовать API конкретной ОС, переносимости кода не будет, надо использовать API какой-либо библиотеки-обертки над API ОС.

Автор: Gwendolen 13.8.2008, 20:06
Цитата(Ulysses4j @  13.8.2008,  19:28 Найти цитируемый пост)
Если использовать API конкретной ОС, переносимости кода не будет, надо использовать API какой-либо библиотеки-обертки над API ОС.

А вот это как раз не желательно.

В принципе продолжение темы корректней продолжить здесь:
http://forum.vingrad.ru/index.php?showtopic=224340&view=findpost&p=1610368

Автор: andrew_121 15.8.2008, 01:44
Цитата(Gwendolen @  13.8.2008,  20:06 Найти цитируемый пост)
А вот это как раз не желательно.

Чё то я не врубаюсь. smile 
Похоже что автор сам еще не знает что ему нужно, или не знает нужно ли ему хоть что-то...
Ну понаблюдаем...
Я думаю автору статьи нужно написать абсолютно новую ОС. На которой будет API Windows, но на самом деле это Linux. Или наоборот.
Это единственное решение. smile 

Автор: bsa 17.8.2008, 16:23
Цитата(andrew_121 @ 15.8.2008,  01:44)
Я думаю автору статьи нужно написать абсолютно новую ОС. На которой будет API Windows, но на самом деле это Linux. Или наоборот.
Это единственное решение. smile

WINE - и ничего писать не нужно smile 

Автор: andrew_121 17.8.2008, 16:40
bsa, Извращение какое-то smile 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)