powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Thread vs OLE
25 сообщений из 32, страница 1 из 2
Thread vs OLE
    #40026376
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую

Есть некий OleVariant (онлайн-касса), в который в отдельном Thread в обычном цикле пихаются данные.
Но хочется иногда из основного потока в ту же самую кассу (OleVariant) подкинуть чеков.
Кошерно ли из разных потоков писать в OLE объект? ошибки, последствия? Или нужно ставить на паузу Thread, формировать чек и затем возобновлять Thread? Или OLE проинициализированный в отдельном Thread вообще не возможно использовать из основного потока (как известно оконные компоненты нельзя создавать и уничтожать в разных потоках, но использовать же можно)?

Поскольку кассы нет (да и если бы была - лишние чеки нежелательны), хотелось бы узнать заранее какова православная логика сего процесса???

ПС дельфи 7 :)
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026387
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потоки могут общаться между собой разными путями. Например, обычными виндовыми сообщениями.
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026442
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

так зачем общаться, напрямую OLE использовать из разных потоков удастся?
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026457
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverin,

хорошо, делай напрямую.
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026461
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

))вы скажите, это не ошибочный изначально путь то?
просто я точно знаю, что некоторые компоненты доступа к БД позволяют из разных потоков юзать, просто пока используется в одном потоке, "висит" в другом, может и тут так же с OLE объектами.

С другой стороны для чего то же нужно делать в новом потоке CoInitialize / CoUninitialize, хотя в основном это не требуется.
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026485
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverin
просто пока используется в одном потоке, "висит" в другом, может и тут так же с OLE объектами.
Зависит от потоковой модели в котором работает COM объект. Если это Apartment (а для OLE обычно так и есть), то все вызовы методов объектов будут перенаправляться в один поток
wolverin
хотя в основном это не требуется.
Требуется. Но они вызываются автоматически в Application.Initialize
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026583
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverin
))вы скажите, это не ошибочный изначально путь то?

Ошибочный.
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026660
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Зависит от потоковой модели в котором работает COM объект. Если это Apartment (а для OLE обычно так и есть), то все вызовы методов объектов будут перенаправляться в один поток

спасибо, т.е. смысла в общем случае нет обмениваться сообщениями между своими потоками и писать прям в OLE объект? а там он сам как нибудь разберется )
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026661
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

хорошо, если ошибочный, то правильно ли будет отправлять сообщение из основного потока в дополнительный, в котором в цикле пихающим данные в кассу делать проверку и при получении сообщения делать sleep на заданное время?
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026677
cptngrb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverin,
с кассой я работаю в основном потоке и жду пока она завершит свои делишки, т.к. все равно запись в БД и т.п. только после выдачи чека (много ошибок может произойти)
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026686
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cptngrb
wolverin,
с кассой я работаю в основном потоке и жду пока она завершит свои делишки, т.к. все равно запись в БД и т.п. только после выдачи чека (много ошибок может произойти)

это хорошо в основном, но у меня несколько касс подключено к ПК, а мне еще надо банковские чеки в офд отправлять, вот они пока что на все кассы улетают одновременно, но это все равно доооооолго, приходят люди и надо чек распечатать.
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026687
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вариант - купить еще касс не предлагать ))
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026694
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverin,

Понимание подразделений COM

авторПравило 3: Никогда не передавайте между подразделениями прямые, немаршаленные указатели на интерфейсы.
...
Поток A может безопасно разделять указатель на интерфейс с потоком B, если он отмаршалит этот указатель. Вот два основных способа которыми COM клиент может отмаршалить интерфейс в другое подразделение:
...
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026695
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverin
wadman,

хорошо, если ошибочный, то правильно ли будет отправлять сообщение из основного потока в дополнительный, в котором в цикле пихающим данные в кассу делать проверку и при получении сообщения делать sleep на заданное время?


С онлайн-кассой я бы работал из одного доп. потока, который бы периодически проверял очередь заданий и общался с онлайн-кассой. Задания добавлять в очередь из основного потока, либо из дополнительных потоков, которые можно создавать на период обслуживания клиента. После отправки задания в поток онлайн-кассы можно производить ожидание окончания обработки задания этим потоком. В основном потоке для ожидания я бы навешивал модальную форму и по таймеру проверял бы статус задания. В доп. потоках я бы ждал с помощью Event или Sleep.
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026700
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

помимо геморроя создания и поддержания очереди, которая нужна то часа 2-3 в течении дня, возникает опять вопрос - как экстренно прервать выполнение очереди и сделать более важное задание.
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026701
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

спасибо, читаю
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026760
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverin
как экстренно прервать выполнение очереди и сделать более важное задание.
Вставить задание в начало очереди
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026764
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

да тупиковая эта идея с очередями имхо, чтобы вставить в начало - нужно будет опять тормозить очередь, чтобы определить это начало, при этом как написано в ссылке kealon(Ruslan), COM модель сама организует очередь из запросов к ней, мне нужно просто в "фоновом" потоке сделать маршалинг указателя, а когда чек нужно срочно выдать - демаршалинг в основном потоке и уже с полученным указателем работать.
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026771
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverin
да тупиковая эта идея с очередями имхо,
Ошибаетесь. Это сильно проще
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026775
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Ошибаетесь. Это сильно проще

чем проще?
очевидно - очередь за которой не нужно следить, намного проще.
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026781
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
единственно непонятно с очередью COM - чек это последовательный вызов около 5 методов, они и в очереди будут в том же порядке или перемешаются в потоках...
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026784
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverin
единственно непонятно с очередью COM - чек это последовательный вызов около 5 методов, они и в очереди будут в том же порядке или перемешаются в потоках...


Объединяйте все вызовы в одно задание, тогда не будет проблем с перемешиванием.
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026787
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

не получится, COM сервер кассы определяет последовательность методов, со своей то очередью понятно что можно хоть как.
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026788
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverin
_Vasilisk_
Ошибаетесь. Это сильно проще

чем проще?
очевидно - очередь за которой не нужно следить, намного проще.


Ваш COM-объект скорее всего рассчитан на последовательную работу с чеками. Сначала один чек. Закрыли. Второй чек. Закрыли и т.д.
В этом случае не надейтесь, что подсистема СОМ выполнит работу за Вас!
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026790
Фотография wolverin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer,

тогда буду в фоновом потоке после закрытия чека отслеживать сообщения, если получил - маршалинг и sleep до получения сообщения "продолжить".
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Thread vs OLE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]