|
|
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
Приветствую Есть некий OleVariant (онлайн-касса), в который в отдельном Thread в обычном цикле пихаются данные. Но хочется иногда из основного потока в ту же самую кассу (OleVariant) подкинуть чеков. Кошерно ли из разных потоков писать в OLE объект? ошибки, последствия? Или нужно ставить на паузу Thread, формировать чек и затем возобновлять Thread? Или OLE проинициализированный в отдельном Thread вообще не возможно использовать из основного потока (как известно оконные компоненты нельзя создавать и уничтожать в разных потоках, но использовать же можно)? Поскольку кассы нет (да и если бы была - лишние чеки нежелательны), хотелось бы узнать заранее какова православная логика сего процесса??? ПС дельфи 7 :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2020, 14:28 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
Потоки могут общаться между собой разными путями. Например, обычными виндовыми сообщениями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2020, 14:45 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wadman, так зачем общаться, напрямую OLE использовать из разных потоков удастся? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2020, 16:26 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wolverin, хорошо, делай напрямую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2020, 16:54 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wadman, ))вы скажите, это не ошибочный изначально путь то? просто я точно знаю, что некоторые компоненты доступа к БД позволяют из разных потоков юзать, просто пока используется в одном потоке, "висит" в другом, может и тут так же с OLE объектами. С другой стороны для чего то же нужно делать в новом потоке CoInitialize / CoUninitialize, хотя в основном это не требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2020, 16:59 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wolverin просто пока используется в одном потоке, "висит" в другом, может и тут так же с OLE объектами. wolverin хотя в основном это не требуется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2020, 17:49 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wolverin ))вы скажите, это не ошибочный изначально путь то? Ошибочный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2020, 20:12 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Зависит от потоковой модели в котором работает COM объект. Если это Apartment (а для OLE обычно так и есть), то все вызовы методов объектов будут перенаправляться в один поток спасибо, т.е. смысла в общем случае нет обмениваться сообщениями между своими потоками и писать прям в OLE объект? а там он сам как нибудь разберется ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 06:10 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wadman, хорошо, если ошибочный, то правильно ли будет отправлять сообщение из основного потока в дополнительный, в котором в цикле пихающим данные в кассу делать проверку и при получении сообщения делать sleep на заданное время? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 06:13 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wolverin, с кассой я работаю в основном потоке и жду пока она завершит свои делишки, т.к. все равно запись в БД и т.п. только после выдачи чека (много ошибок может произойти) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 08:27 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
cptngrb wolverin, с кассой я работаю в основном потоке и жду пока она завершит свои делишки, т.к. все равно запись в БД и т.п. только после выдачи чека (много ошибок может произойти) это хорошо в основном, но у меня несколько касс подключено к ПК, а мне еще надо банковские чеки в офд отправлять, вот они пока что на все кассы улетают одновременно, но это все равно доооооолго, приходят люди и надо чек распечатать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 08:53 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
вариант - купить еще касс не предлагать )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 08:54 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wolverin, Понимание подразделений COM авторПравило 3: Никогда не передавайте между подразделениями прямые, немаршаленные указатели на интерфейсы. ... Поток A может безопасно разделять указатель на интерфейс с потоком B, если он отмаршалит этот указатель. Вот два основных способа которыми COM клиент может отмаршалить интерфейс в другое подразделение: ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 09:23 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wolverin wadman, хорошо, если ошибочный, то правильно ли будет отправлять сообщение из основного потока в дополнительный, в котором в цикле пихающим данные в кассу делать проверку и при получении сообщения делать sleep на заданное время? С онлайн-кассой я бы работал из одного доп. потока, который бы периодически проверял очередь заданий и общался с онлайн-кассой. Задания добавлять в очередь из основного потока, либо из дополнительных потоков, которые можно создавать на период обслуживания клиента. После отправки задания в поток онлайн-кассы можно производить ожидание окончания обработки задания этим потоком. В основном потоке для ожидания я бы навешивал модальную форму и по таймеру проверял бы статус задания. В доп. потоках я бы ждал с помощью Event или Sleep. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 09:29 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
DmSer, помимо геморроя создания и поддержания очереди, которая нужна то часа 2-3 в течении дня, возникает опять вопрос - как экстренно прервать выполнение очереди и сделать более важное задание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 09:53 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), спасибо, читаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 09:54 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wolverin как экстренно прервать выполнение очереди и сделать более важное задание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 12:15 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, да тупиковая эта идея с очередями имхо, чтобы вставить в начало - нужно будет опять тормозить очередь, чтобы определить это начало, при этом как написано в ссылке kealon(Ruslan), COM модель сама организует очередь из запросов к ней, мне нужно просто в "фоновом" потоке сделать маршалинг указателя, а когда чек нужно срочно выдать - демаршалинг в основном потоке и уже с полученным указателем работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 12:22 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wolverin да тупиковая эта идея с очередями имхо, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 12:33 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Ошибаетесь. Это сильно проще чем проще? очевидно - очередь за которой не нужно следить, намного проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 12:36 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
единственно непонятно с очередью COM - чек это последовательный вызов около 5 методов, они и в очереди будут в том же порядке или перемешаются в потоках... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 12:44 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wolverin единственно непонятно с очередью COM - чек это последовательный вызов около 5 методов, они и в очереди будут в том же порядке или перемешаются в потоках... Объединяйте все вызовы в одно задание, тогда не будет проблем с перемешиванием. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 12:49 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
DmSer, не получится, COM сервер кассы определяет последовательность методов, со своей то очередью понятно что можно хоть как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 12:55 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wolverin _Vasilisk_ Ошибаетесь. Это сильно проще чем проще? очевидно - очередь за которой не нужно следить, намного проще. Ваш COM-объект скорее всего рассчитан на последовательную работу с чеками. Сначала один чек. Закрыли. Второй чек. Закрыли и т.д. В этом случае не надейтесь, что подсистема СОМ выполнит работу за Вас! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 12:55 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
DmSer, тогда буду в фоновом потоке после закрытия чека отслеживать сообщения, если получил - маршалинг и sleep до получения сообщения "продолжить". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 12:59 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wolverin DmSer, не получится, COM сервер кассы определяет последовательность методов, со своей то очередью понятно что можно хоть как. Размещайте задание в очередь только после того, как известны все необходимые данные для печати чека, в том числе все строки, скидки, ИНН, тэги и т.д. Что тут может не получиться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 13:00 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
DmSer, чем проще, тем лучше, в нынешних реалиях конечно не так критично, но создавать и отслеживать несколько (не менее 3х - n касс) очередей n+1 потоками с количеством записей порядка 2-3 тысяч имхо не лучшая идея. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 13:03 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
DmSer, на атол.ру вон очереди касс сделали - год с ними бился чтобы геморой с очередями исправили, даже деньги частично вернули, один фиг нет нет да валится в таймаут чеки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 13:07 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wolverin единственно непонятно с очередью COM - чек это последовательный вызов около 5 методов, они и в очереди будут в том же порядке или перемешаются в потоках... COM-обеспечит атомарность отдельного вызова, если сервер не поддерживает мультипоточность но если сервер не может нормально организовать отдельную задачу, понятно что придётся делать свою синхронизацию вызова этих 5 методов - для этого вполне хватит критической секции без исходников сервера не попробуешь, не узнаешь PS: см ещё авторПравило 2: STA Потокам нужен цикл обработки сообщений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 13:56 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wolverin, если я правильно понимаю саму задачу, то сервер должен по сути поддерживать создание транзакции, её заполнение и отправку вроде бы тут ничего такого криминального быть не должно, если он объектами оперирует если делать как доктор прописал, не опираясь на знание внутренней реализации (чего COM от нас и требует) 1. что бы не грузить главный поток и не наткнуться на косяки VCL, в идеале нужно создать свой с COINIT_APARTMENTTHREADED, создать в нём объект и запустить обработку петли сообщений 2. в остальных местах использовать отмаршаленный указатель, прикрыв косую логику где надо критическим секциями 3. если уж совсем накипит, то слать разработчикам гневную петицию с указанием их ошибок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 14:14 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
wolverin очевидно - очередь за которой не нужно следить, намного проще. wolverin единственно непонятно с очередью COM - чек это последовательный вызов около 5 методов, они и в очереди будут в том же порядке или перемешаются в потоках... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 14:28 |
|
||
|
Thread vs OLE
|
|||
|---|---|---|---|
|
#18+
Не рекомендую обращаться к объекту из разных потоков. сделайте один поток и очередь чеков, Ваш поток занимается только тем, что передает чек в кассу, и записывает результат по этому чеку в очередь. Ставьте ваш чек в очередь и ждите результата. Если надо какой-то чек в приоритете - организуйте приоритетную постановку в очередь, делов-то... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.12.2020, 23:59 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2037787]: |
0ms |
get settings: |
5ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
153ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 242ms |
| total: | 470ms |

| 0 / 0 |
