Есть ли способ создать очередь печати OPOS С#

Окружающая среда: у меня есть 2 принтера epson, подключенных через сеть. Эти принтеры печатают все квитанции с 5 ПК с POS на С# с использованием OPOS.

Проблема: В большинстве случаев принтеры не могут распечатать билеты, потому что они заблокированы некоторыми POS. В других случаях принтеры печатают слишком долго.

Код печати:

p.printerOPOS.Open();
p.printerOPOS.Claim(PRINT_WAIT_SECONDS); //5 seconds
p.printerOPOS.DeviceEnabled = true;
p.printerOPOS.PrintNormal(PrinterStation.Receipt, builder);
p.printerOPOS.DeviceEnabled = false;
p.printerOPOS.Close();

Вопрос: Как я могу обеспечить печать? Есть ли способ создать очередь OPOS (как в Windows для обычной печати)?


person Fernando Santiago    schedule 28.02.2019    source источник


Ответы (1)


Лучше не использовать ОПОС из отдельных приложений, а пересмотреть и изменить структуру приложения.

  1. Только один ПК управляет печатью на двух билетных принтерах.
  2. Создайте приложение, выполняющее службу печати на управляющем ПК.
  3. Приложение службы печати определяет и реализует необходимые функции, такие как прием запроса на печать, уведомление об ожидании/выполнении/состоянии ошибки, отмена печати, уведомление о собственном состоянии принтера и уведомление в POS-приложение.
  4. Приложение POS использует эти интерфейсы для отправки запроса на печать в приложение, которое выполняет службу печати и получает уведомление/результат.

Дополнительно:
Нижеследующее ответило на вопрос об использовании одного POSPrinter на одном компьютере с JavaPOS, но это также может быть применено к ситуациям, подобным вашему вопросу.
Если вы имеете дело только с использованием OPOS , пожалуйста, учтите это.


Это зависит от программной структуры приложения.

Если приложение, использующее принтер, имеет только один процесс, выполните Open(), Claim(), DeviceEnabled=True один раз при запуске приложения. Вы можете выполнить DeviceEnabled=False, Release(), Close() непосредственно перед завершением работы приложения.

При необходимости приложение объединяет TransactionPrint(), RotatePrint(), PrintNormal() и т. д. для печати.

Это сокращает время, необходимое для печати.

Если приложения, использующие принтеры, выполняются одновременно более чем в одном процессе, то только Open() в каждом процессе.

Если процесс, требующий печати, остается практически неизменным, Claim() и DeviceEnabled=True на стороне получения права управления принтером одновременно с синхронизацией переключения задания и экрана, сторона освобождения права управления принтером С DeviceEnabled=False, Release() называется.

Когда процессы, требующие печати, часто меняются, Claim(), DeviceEnabled=True выполняются после каждого использования принтера, а после завершения печати, когда необходимая печать завершена, DeviceEnabled=False, Release() удерживают.

person kunif    schedule 28.02.2019
comment
Что было бы лучшим решением для OPOS? Мне нужно персонализировать каждый билет, а у моих клиентов разные принтеры. - person Fernando Santiago; 28.02.2019