Конференция "Начинающим" » Помогите написать работу с потоком [D7]
 
  • Inovet © (24.08.17 09:09) [20]
    > [17] Kirill ©   (24.08.17 08:49)
    > Смысл в том, чтобы пользователь продолжал работать с кассой,
    > а сама программа отправляла подтверждения оплат не блокируя
    > интерфейс.

    Способы реализации на Делфи здесь вторичны. Есть специальные объекты для синхроницации потоков. Поток кассы сигнализирует через такой объект, что у него появились новые чеки, поток отправки находится в спячке через вызов WaitForSingleObject, просыавется, отправляет эти данные и снова уходит в засыпание через вызов WaitForSingleObject (WaitForMultipleObject). Дополнительно надо обеспечить блокировку одновременного изменения данных двумя потоками - это уже от логики и структуры данных. Тепрь то же самое через обёртки этого хозяйства в Делфи.
  • Inovet © (24.08.17 09:12) [21]
  • Kirill © (24.08.17 09:12) [22]
    Это если на отправку только один последний чек, а если чеков наберется больше и скорость с сервисом будет не ахти, то фриз будет.
    Спасибо Synchronize убрал. Понял, что его надо использовать для работы с vcl данными, например обновить количество неотправленных данных, а так как у меня это не выводится, то и не нужно.
  • rrrrrrr © (24.08.17 09:15) [23]
    не ахти, то фриз будет.

    он и в твоем варианте с потоком "от брата" будет.
    точно такой же.
    как и без потока "от брата"
  • Inovet © (24.08.17 09:18) [24]
    > [22] Kirill ©   (24.08.17 09:12)
    > Это если на отправку только один последний чек, а если чеков
    > наберется больше и скорость с сервисом будет не ахти, то
    > фриз будет.

    Пока все не отправит в ожидание не уходить.
  • Kirill © (24.08.17 09:38) [25]
    Уважаемый, rrrrrrr.
    Вместо того, чтобы писать какой %%%%%% код вы написали с братом, лучше подсказали на этом примере как его исправить, чтобы он работал правильно и описали почему надо делать так.
    А с Вашим подходом можно любую программу критиковать: от блокнота до всей ОС.


    > Пока все не отправит в ожидание не уходить

    Извините, не понял. В смысле в этом потоке все данные сразу отправлять без пауз?
  • Inovet © (24.08.17 09:59) [26]
    > [25] Kirill ©   (24.08.17 09:38)
    > В смысле в этом потоке все данные сразу отправлять без
    > пауз?

    Кассовый поток накопил данные чеков от 1 до Н за некоторое установленное время - минута-час-сутки или по мере поступления, в зависимости от требований, сообщил по количеству или, при наличии меньшего количества, по таймауту отправляющему, отправляющий начал их отправлять, например, пакетами по М штук, не хватило на пакет - отправил сколько есть.

    Возможна и другая логика. С таймаутом тоже - в каком его потоке опрабатывать, в кассовом или в отправляющем, стоит подумать, имхо в кассовом логичнее. Но суть синхронизации такая.
  • Inovet © (24.08.17 10:00) [27]
    > [25] Kirill ©   (24.08.17 09:38)
    > лучше подсказали на этом примере как его исправить, чтобы
    > он работал правильно и описали почему надо делать так.

    Так это в кижках надо читать, а не переписывать приведённый код.
  • rrrrrrr © (24.08.17 10:13) [28]
    как помочь ламеру,
    если у него все усилия уходят на упереться рогом и всеми копытами,
    доказывая, что написано правильно, в то время как написана бессмыслица.

    образец:

    > Больше ничего второй поток не делает. Какой же тогда в нем
    > смысл? Без него все будет работать точно так же.

    Смысл в том, чтобы пользователь продолжал работать с кассой, а сама программа отправляла подтверждения оплат не блокируя интерфейс.



    ответ : никак.
  • Kirill © (24.08.17 10:19) [29]

    > Кассовый поток накопил данные чеков

    Вот тут я бы точно не стал делать... С новым, блин, законом 54-ФЗ главное чтобы кассовый поток (он же основной) печатал чек и по результатам печати заносил в локальную бд информацию.
    Я кажется понял Вашу идею, но не уверен насчет целесообразности такого метода. Зачем "грузить" кассовый поток ненужной выборкой. Пусть работает с кассиром и оборудованием.


    > Так это в кижках надо читать, а не переписывать приведённый
    > код.

    Еще раз повторюсь, я в эту конференцию (Новичкам) не потому написал, что не знаю Delphi, а потому что не могу понять как на практике применить работу с потоками. Я и книги читал и примеры смотрел, ну не получается понять...
    На текущий момент убрал из последнего кода синхронизацию SendData. И с ним и без него не было фризов.

    Еще раз всем спасибо за обсуждение и критику.
  • Inovet © (24.08.17 10:23) [30]
    > [29] Kirill ©   (24.08.17 10:19)
    > Я кажется понял Вашу идею, но не уверен насчет целесообразности
    > такого метода. Зачем "грузить" кассовый поток ненужной выборкой.
    > Пусть работает с кассиром и оборудованием.

    Неправильно понял. Кассовый и так это всё делает, но должен просигналить отправляющему о готовности данных, иначе как тот узнает о их наличии.
  • rrrrrrr © (24.08.17 10:26) [31]
    а потому что не могу понять как на практике применить работу с потоками.

    ты не можешь понять гораздо более главного.

    начинать проектировать многопоточность (и не только) надо в терминах реального мира и своей предметной области.

    а ты же сразу начинаешь искать в каком порядке скомбинировать знакомые слова из делфи в надежде что какая-то комбинация решит задачу.
  • Kirill © (24.08.17 10:31) [32]

    > Кассовый и так это всё делает, но должен просигналить отправляющему
    > о готовности данных, иначе как тот узнает о их наличии.

    В Execute потока бесконечный цикл с паузой и выборкой неотправленных данных (Поле POSTED = 0).
  • Inovet © (24.08.17 10:39) [33]
    > [32] Kirill ©   (24.08.17 10:31)
    > В Execute потока бесконечный цикл с паузой и выборкой неотправленных
    > данных (Поле POSTED = 0).

    ЮЗ выше в [15] Юрий Зотов ©   (24.08.17 07:25) уже сказал, что там. Перечитай.
  • sniknik © (24.08.17 10:53) [34]
    > Понял, что его надо использовать для работы с vcl данными
    прикол в том, что датамодуль, хттп, датасет на датамодуле, это все тоже vcl, т.е. по "букве" все правильно брат сделал, но по сути абсолютно неверно.

    вообще, все это (датамодуль, и все на нем лежащее) можно использовать в потоке, но только если абсолютно уверен, что к этому же нет обращений из других потоков, основного в том числе. и не только твоих... если компонент делает что-то автоматом, по событиям например от системы, то тоже.
    но лучше, если ты создашь все необходимое в рантайм, прямо в Execute потока, как и все ему возможно необходимое (например для COM необходим вызов Coinitialize, на каждый поток отдельный)
  • Kirill © (24.08.17 10:59) [35]

    > но лучше, если ты создашь все необходимое в рантайм, прямо
    > в Execute потока, как и все ему возможно необходимое (например
    > для COM необходим вызов Coinitialize, на каждый поток отдельный)

    Понял. Сейчас реализую. Спасибо. Видимо придется заменить библиотеку fbembeded на полноценную с файловым хранилищем.Он ведь не будет требовать установленный FBServer на сколько я помню?

    Перечитал пост Юрия:
    1. Убрал
    2. Убрал
    3. фоновый поток только и нужен чтобы отправить данные и все. больше ничего он и не должен делать.
  • Inovet © (24.08.17 11:09) [36]
    > [35] Kirill ©   (24.08.17 10:59)
    > 2. Убрал

    Sleep не убрать надо, а переделать логику, как я 2 раза выше говорил.
  • Kirill © (24.08.17 11:22) [37]

    > как я 2 раза выше говорил.

    Можно тогда для тех кто в танке?

    Основной код пробивает чек на ККТ. Если успешно записывает в БД запись. Дальше:
    1. создается поток и туда передается эта запись?
    2. в уже созданный поток передается эта запись? как образом?
  • Inovet © (24.08.17 11:46) [38]
    > [37] Kirill ©   (24.08.17 11:22)
    > 2. в уже созданный поток передается эта запись? как образом?

    В уже созданный поток.
    Что значит передаётся? Кассовый сохранил, передающий по сигналу от кассового проснулся и забрал. Как я понял, кассовые операции и так хранятся в некой локальной БД, так что в этом случае оба потока к этой БД и обращаются.

    Я говорю, что не надо бессмысленно крутить цикл и грузить этим систему, а сделать правильно через синхронизацию. Как описал выше.
  • Kirill © (24.08.17 11:56) [39]

    > что не надо бессмысленно крутить цикл и грузить этим систему,
    >  а сделать правильно через синхронизацию. Как описал выше.
    >

    Это через команды Resume/Suspend?
 
Конференция "Начинающим" » Помогите написать работу с потоком [D7]
Есть новые Нет новых   [118460   +13][b:0][p:0.001]