powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Thread vs OLE
32 сообщений из 32, показаны все 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
Thread vs OLE
    #40026792
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverin
DmSer,

не получится, COM сервер кассы определяет последовательность методов, со своей то очередью понятно что можно хоть как.


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

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

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


без исходников сервера не попробуешь, не узнаешь

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

если я правильно понимаю саму задачу, то сервер должен по сути поддерживать создание транзакции, её заполнение и отправку
вроде бы тут ничего такого криминального быть не должно, если он объектами оперирует

если делать как доктор прописал, не опираясь на знание внутренней реализации (чего COM от нас и требует)

1. что бы не грузить главный поток и не наткнуться на косяки VCL, в идеале нужно создать свой с COINIT_APARTMENTTHREADED, создать в нём объект и запустить обработку петли сообщений

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

3. если уж совсем накипит, то слать разработчикам гневную петицию с указанием их ошибок
...
Рейтинг: 0 / 0
Thread vs OLE
    #40026836
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wolverin
очевидно - очередь за которой не нужно следить, намного проще.
А для меня очевидно, что контролируемая очередь, на написание которой уйдет максимум 50 строк кода сильно проще
wolverin
единственно непонятно с очередью COM - чек это последовательный вызов около 5 методов, они и в очереди будут в том же порядке или перемешаются в потоках...
Конечно перемешаются. Что здесь непонятного?
...
Рейтинг: 0 / 0
Thread vs OLE
    #40027077
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не рекомендую обращаться к объекту из разных потоков.
сделайте один поток и очередь чеков,
Ваш поток занимается только тем, что передает чек в кассу, и записывает результат по этому чеку в очередь.

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


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