Многопоточность при разработке плагина

Здесь обсуждаются технические аспекты создания дополнений.
$teelR@t
Сообщения: 348
Зарегистрирован: 19:14, 30.03.2008
Откуда: Украина
Контактная информация:

Многопоточность при разработке плагина

Сообщение $teelR@t »

Предлагаю в этой теме обсуждать все проблемы связанные с многопоточностью, которые могут возникнуть при работе плагина с сервером.
Не важно как долго ты будеш подниматься, упасть ты можеш в мгновенье ока.
Макс Пейн.
$teelR@t
Сообщения: 348
Зарегистрирован: 19:14, 30.03.2008
Откуда: Украина
Контактная информация:

Re: Многопоточность при разработке плагина

Сообщение $teelR@t »

И первый вопрос:
Судя по тому как я понял - импортируемые функции (CommFortProcess и CommFortGetData) должны вызываться только в основном потоке?
Если да, то выскажите пожалуйста свои способы наиболее оптимальной синхронизации потоков.
Не важно как долго ты будеш подниматься, упасть ты можеш в мгновенье ока.
Макс Пейн.
Maxim Mirgorodsky
Администратор
Сообщения: 6879
Зарегистрирован: 09:56, 27.06.2005

Re: Многопоточность при разработке плагина

Сообщение Maxim Mirgorodsky »

Можем реализовать описанный здесь метод: http://wiki.qip.ru/Создание_многопоточного_плагина . То есть плагин из дополнительного потока посылает программе сообщение, а программа в момент обработки этого сообщения из основного потока вызовет дополнительную функцию плагина.
$teelR@t
Сообщения: 348
Зарегистрирован: 19:14, 30.03.2008
Откуда: Украина
Контактная информация:

Re: Многопоточность при разработке плагина

Сообщение $teelR@t »

Тут собственно не проблема организовать запуск функции из основного потока. Просто надо где-то хранить данные, которые понадобятся функции.
Допустим мне надо вызвать функцию выхода пользователя из чата. Для этого я должен сформировать строку в соответствии с API с его ником. Но где хранить эту строку?

Есть 2 варианта, которые можно реализовать хоть сейчас:
1. Определить функцию стандартными средствами C++ Builder, которая будет обработчиком PostMessage/SendMessage. Послать со второго потока через SendMessage указатель на сформированную для API строку, а основной поток получит сообщение, вызовет нашу функцию и передаст ей параметром указатель на строку, а потом выполнит запрос к серверу.
Плюс - самая простая реализация.
Минус - второй поток будет ждать пока основной поток выполнит функцию.
2. Определить функцию стандартными средствами C++ Builder, которая будет обработчиком PostMessage/SendMessage. Поместить в какой-то список строку, которую надо отослать серверу и вызвать PostMessage, который вызовет функцию, которая в свою очередь пройдется по списку и отошлет серверу все запросы.
Плюс - второй поток не ожидает выполнения функции (особенность PostMessage).
Минус - для доступа к списку придется делать блокирование (можно Критическими секциями), которое опять же может заставить второй поток ждать.

Как видно везде есть недостатки... Что можете предложить?
Не важно как долго ты будеш подниматься, упасть ты можеш в мгновенье ока.
Макс Пейн.
Maxim Mirgorodsky
Администратор
Сообщения: 6879
Зарегистрирован: 09:56, 27.06.2005

Re: Многопоточность при разработке плагина

Сообщение Maxim Mirgorodsky »

После отправки сообщения программе и вплоть до выполнения специальной функции в основном потоке дополнительный поток должен приостанавливаться. Это защитит от попытки доступа к данным с разных потоков.
$teelR@t
Сообщения: 348
Зарегистрирован: 19:14, 30.03.2008
Откуда: Украина
Контактная информация:

Re: Многопоточность при разработке плагина

Сообщение $teelR@t »

Да, это самый надежный способ, но не самый быстрый. Чуть быстрее - PostMessage, но его реализация сложнее и прийдется использовать список с блокированием доступа.
Кстати, а на сколько быстро выполняются запросы к плагину на подключение и отключение пользователей?
Не важно как долго ты будеш подниматься, упасть ты можеш в мгновенье ока.
Макс Пейн.
Maxim Mirgorodsky
Администратор
Сообщения: 6879
Зарегистрирован: 09:56, 27.06.2005

Re: Многопоточность при разработке плагина

Сообщение Maxim Mirgorodsky »

Да, это самый надежный способ, но не самый быстрый.
Многопоточность используется в случае необходимости исполнения только ресурсоемких операций. Время исполнения этих операций совсем другого порядка, нежели один цикл петли сообщений. Так что задержку прохождения петли можно вообще не считать (если конечно не пользоваться многопоточностью для вычисления циклов задач, исполняющихся за тысячные доли микросекунды каждая).
Кстати, а на сколько быстро выполняются запросы к плагину на подключение и отключение пользователей?
Не совсем понятен вопрос.
$teelR@t
Сообщения: 348
Зарегистрирован: 19:14, 30.03.2008
Откуда: Украина
Контактная информация:

Re: Многопоточность при разработке плагина

Сообщение $teelR@t »

Maxim Mirgorodsky писал(а):
Кстати, а на сколько быстро выполняются запросы к плагину на подключение и отключение пользователей?
Не совсем понятен вопрос.
На сколько быстро происходит возврат из импортируемой функции CommFortProcess при передаче ей id действий 1001 и 1002 и остальных параметров?
Не важно как долго ты будеш подниматься, упасть ты можеш в мгновенье ока.
Макс Пейн.
Maxim Mirgorodsky
Администратор
Сообщения: 6879
Зарегистрирован: 09:56, 27.06.2005

Re: Многопоточность при разработке плагина

Сообщение Maxim Mirgorodsky »

Функция выполняется асинхронно, то есть возврат происходит сразу.
$teelR@t
Сообщения: 348
Зарегистрирован: 19:14, 30.03.2008
Откуда: Украина
Контактная информация:

Re: Многопоточность при разработке плагина

Сообщение $teelR@t »

Maxim Mirgorodsky писал(а):Функция выполняется асинхронно, то есть возврат происходит сразу.
Это особенность импортированных функций или вы сами реализовали асинхронность?
Не важно как долго ты будеш подниматься, упасть ты можеш в мгновенье ока.
Макс Пейн.
Maxim Mirgorodsky
Администратор
Сообщения: 6879
Зарегистрирован: 09:56, 27.06.2005

Re: Многопоточность при разработке плагина

Сообщение Maxim Mirgorodsky »

Сами.
Ответить