Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2 3 4

Помогите написать работу с потоком [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]

https://msdn.microsoft.com/en-us/library/windows/desktop/ms686360(v=vs.85).aspx


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?


Страницы: 1 2 3 4 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо