-
> [17] Kirill © (24.08.17 08:49) > Смысл в том, чтобы пользователь продолжал работать с кассой, > а сама программа отправляла подтверждения оплат не блокируя > интерфейс.
Способы реализации на Делфи здесь вторичны. Есть специальные объекты для синхроницации потоков. Поток кассы сигнализирует через такой объект, что у него появились новые чеки, поток отправки находится в спячке через вызов WaitForSingleObject, просыавется, отправляет эти данные и снова уходит в засыпание через вызов WaitForSingleObject (WaitForMultipleObject). Дополнительно надо обеспечить блокировку одновременного изменения данных двумя потоками - это уже от логики и структуры данных. Тепрь то же самое через обёртки этого хозяйства в Делфи.
-
-
Это если на отправку только один последний чек, а если чеков наберется больше и скорость с сервисом будет не ахти, то фриз будет. Спасибо Synchronize убрал. Понял, что его надо использовать для работы с vcl данными, например обновить количество неотправленных данных, а так как у меня это не выводится, то и не нужно.
-
не ахти, то фриз будет.
он и в твоем варианте с потоком "от брата" будет. точно такой же. как и без потока "от брата"
-
> [22] Kirill © (24.08.17 09:12) > Это если на отправку только один последний чек, а если чеков > наберется больше и скорость с сервисом будет не ахти, то > фриз будет.
Пока все не отправит в ожидание не уходить.
-
Уважаемый, rrrrrrr. Вместо того, чтобы писать какой %%%%%% код вы написали с братом, лучше подсказали на этом примере как его исправить, чтобы он работал правильно и описали почему надо делать так. А с Вашим подходом можно любую программу критиковать: от блокнота до всей ОС.
> Пока все не отправит в ожидание не уходить
Извините, не понял. В смысле в этом потоке все данные сразу отправлять без пауз?
-
> [25] Kirill © (24.08.17 09:38) > В смысле в этом потоке все данные сразу отправлять без > пауз?
Кассовый поток накопил данные чеков от 1 до Н за некоторое установленное время - минута-час-сутки или по мере поступления, в зависимости от требований, сообщил по количеству или, при наличии меньшего количества, по таймауту отправляющему, отправляющий начал их отправлять, например, пакетами по М штук, не хватило на пакет - отправил сколько есть.
Возможна и другая логика. С таймаутом тоже - в каком его потоке опрабатывать, в кассовом или в отправляющем, стоит подумать, имхо в кассовом логичнее. Но суть синхронизации такая.
-
> [25] Kirill © (24.08.17 09:38) > лучше подсказали на этом примере как его исправить, чтобы > он работал правильно и описали почему надо делать так.
Так это в кижках надо читать, а не переписывать приведённый код.
-
как помочь ламеру, если у него все усилия уходят на упереться рогом и всеми копытами, доказывая, что написано правильно, в то время как написана бессмыслица.
образец:
> Больше ничего второй поток не делает. Какой же тогда в нем > смысл? Без него все будет работать точно так же.
Смысл в том, чтобы пользователь продолжал работать с кассой, а сама программа отправляла подтверждения оплат не блокируя интерфейс.
ответ : никак.
-
> Кассовый поток накопил данные чеков
Вот тут я бы точно не стал делать... С новым, блин, законом 54-ФЗ главное чтобы кассовый поток (он же основной) печатал чек и по результатам печати заносил в локальную бд информацию. Я кажется понял Вашу идею, но не уверен насчет целесообразности такого метода. Зачем "грузить" кассовый поток ненужной выборкой. Пусть работает с кассиром и оборудованием.
> Так это в кижках надо читать, а не переписывать приведённый > код.
Еще раз повторюсь, я в эту конференцию (Новичкам) не потому написал, что не знаю Delphi, а потому что не могу понять как на практике применить работу с потоками. Я и книги читал и примеры смотрел, ну не получается понять... На текущий момент убрал из последнего кода синхронизацию SendData. И с ним и без него не было фризов.
Еще раз всем спасибо за обсуждение и критику.
-
> [29] Kirill © (24.08.17 10:19) > Я кажется понял Вашу идею, но не уверен насчет целесообразности > такого метода. Зачем "грузить" кассовый поток ненужной выборкой. > Пусть работает с кассиром и оборудованием.
Неправильно понял. Кассовый и так это всё делает, но должен просигналить отправляющему о готовности данных, иначе как тот узнает о их наличии.
-
а потому что не могу понять как на практике применить работу с потоками.
ты не можешь понять гораздо более главного.
начинать проектировать многопоточность (и не только) надо в терминах реального мира и своей предметной области.
а ты же сразу начинаешь искать в каком порядке скомбинировать знакомые слова из делфи в надежде что какая-то комбинация решит задачу.
-
> Кассовый и так это всё делает, но должен просигналить отправляющему > о готовности данных, иначе как тот узнает о их наличии.
В Execute потока бесконечный цикл с паузой и выборкой неотправленных данных (Поле POSTED = 0).
-
> [32] Kirill © (24.08.17 10:31) > В Execute потока бесконечный цикл с паузой и выборкой неотправленных > данных (Поле POSTED = 0).
ЮЗ выше в [15] Юрий Зотов © (24.08.17 07:25) уже сказал, что там. Перечитай.
-
> Понял, что его надо использовать для работы с vcl данными прикол в том, что датамодуль, хттп, датасет на датамодуле, это все тоже vcl, т.е. по "букве" все правильно брат сделал, но по сути абсолютно неверно.
вообще, все это (датамодуль, и все на нем лежащее) можно использовать в потоке, но только если абсолютно уверен, что к этому же нет обращений из других потоков, основного в том числе. и не только твоих... если компонент делает что-то автоматом, по событиям например от системы, то тоже. но лучше, если ты создашь все необходимое в рантайм, прямо в Execute потока, как и все ему возможно необходимое (например для COM необходим вызов Coinitialize, на каждый поток отдельный)
-
> но лучше, если ты создашь все необходимое в рантайм, прямо > в Execute потока, как и все ему возможно необходимое (например > для COM необходим вызов Coinitialize, на каждый поток отдельный)
Понял. Сейчас реализую. Спасибо. Видимо придется заменить библиотеку fbembeded на полноценную с файловым хранилищем.Он ведь не будет требовать установленный FBServer на сколько я помню?
Перечитал пост Юрия: 1. Убрал 2. Убрал 3. фоновый поток только и нужен чтобы отправить данные и все. больше ничего он и не должен делать.
-
> [35] Kirill © (24.08.17 10:59) > 2. Убрал
Sleep не убрать надо, а переделать логику, как я 2 раза выше говорил.
-
> как я 2 раза выше говорил.
Можно тогда для тех кто в танке?
Основной код пробивает чек на ККТ. Если успешно записывает в БД запись. Дальше: 1. создается поток и туда передается эта запись? 2. в уже созданный поток передается эта запись? как образом?
-
> [37] Kirill © (24.08.17 11:22) > 2. в уже созданный поток передается эта запись? как образом?
В уже созданный поток. Что значит передаётся? Кассовый сохранил, передающий по сигналу от кассового проснулся и забрал. Как я понял, кассовые операции и так хранятся в некой локальной БД, так что в этом случае оба потока к этой БД и обращаются.
Я говорю, что не надо бессмысленно крутить цикл и грузить этим систему, а сделать правильно через синхронизацию. Как описал выше.
-
> что не надо бессмысленно крутить цикл и грузить этим систему, > а сделать правильно через синхронизацию. Как описал выше. >
Это через команды Resume/Suspend?
|