打印池

餐飲行業,打印池是必要的部件。

實現原理:每一臺打印機都有自己的任務隊列和處理任務隊列的線程。

?

unit untPrintTask;

interface

uses
System.SysUtils, System.Classes,
Datasnap.DBClient, frxclass,
System.Generics.Collections;

type
TBillContent = record // 小票內容
machineNo: string; // POS機號
skyName: string; // 收款員姓名
saleNo: string; // 小票號
saleTime: TDateTime; // 銷售時間
amount: Currency; // 應收
pay: Currency; // 支付
change: Currency; // 找零
prnData: OleVariant; // 小票明細:商品名稱、單價、數量、金額。。。。。。
deskNo:string; // 臺號
payType: string; // 支付方式
end;

type
TPrinterInfo = record // 打印機信息
prnNo: Integer; // 印機編號
prnName: string; // 印機名稱
prnType: string; // 結賬、廚打
prnWidth: Integer; // 50mm\76mm\80mm
remark: string; // 備注
prnModel: string; // 打印模版
end;

type
TOneTimePrint = record // 一次打印
printerInfo: TPrinterInfo; // 打印機信息
billContent: TBillContent; // 小票內容
end;

type
TPrintTaskThread = class(TThread) // 打印任務線程
private
FPrintQueue: TQueue<TOneTimePrint>; // 打印隊列
protected
procedure Execute; override;
public
constructor Create; overload;
destructor Destroy; override;
property PrintQueue: TQueue<TOneTimePrint> read FPrintQueue
write FPrintQueue;
end;

var
g_PrintTasks: TDictionary<string, TPrintTaskThread>; // <打印機名字, TPrintTask>

implementation

{ TPrintTask }

uses untFastReport, UntSysConst;

constructor TPrintTaskThread.Create;
begin
Create(False);
FreeOnTerminate := False;
// 創建打印隊列
FPrintQueue := TQueue<TOneTimePrint>.Create;
end;

destructor TPrintTaskThread.Destroy;
begin
// 釋放打印隊列
FreeAndNil(FPrintQueue);
inherited;
end;

procedure TPrintTaskThread.Execute;
var
OneTimePrint: TOneTimePrint;
dm: TdmFastReport;
c: TfrxComponent;
begin
while not Self.Terminated do
begin
if Assigned(FPrintQueue) and (FPrintQueue.Count > 0) then
begin
// 從任務隊列中提取一個任務
OneTimePrint := FPrintQueue.Dequeue;
dm := TdmFastReport.Create(nil);
try
try
// 小票明細數據
dm.cds.Data := OneTimePrint.billContent.prnData;
// 小票模板
dm.report.LoadFromFile(OneTimePrint.printerInfo.prnModel);
// 哪個打印機
dm.report.PrintOptions.Printer := OneTimePrint.printerInfo.prnName;
// 變量賦值

c:=dm.report.FindObject('mmShopName');
if c<>nil then
TfrxMemoView(c).Memo.Text := UserInfo.ShopName;

c := dm.report.FindObject('mmMachineNo');
if c<>nil then
TfrxMemoView(c).Memo.Text := OneTimePrint.billContent.machineNo;

c:=dm.report.FindObject('mmSKY');
if c<>nil then
TfrxMemoView(c).Memo.Text := OneTimePrint.billContent.skyName;

c:= dm.report.FindObject('mmBillNo');
if c<>nil then
TfrxMemoView(c).Memo.Text := OneTimePrint.billContent.saleNo;

c:=dm.report.FindObject('mmSaleTime');
if c<>nil then
TfrxMemoView(c).Memo.Text := FormatDateTime('yyyy-mm-dd hh:nn',OneTimePrint.billContent.saleTime);

c:= dm.report.FindObject('mmDeskNo');
if c<>nil then
TfrxMemoView(c).Memo.Text := OneTimePrint.billContent.deskNo; // 臺號

c:= dm.report.FindObject('mmPayType');
if c<>nil then
TfrxMemoView(c).Memo.Text := OneTimePrint.billContent.payType;

c:= dm.report.FindObject('mmAmount');
if c<> nil then
TfrxMemoView(c).Memo.Text := FormatCurr('0.00', OneTimePrint.billContent.amount);

c:=dm.report.FindObject('mmPay');
if c<>nil then
TfrxMemoView(c).Memo.Text := FormatCurr('0.00', OneTimePrint.billContent.pay);

c:= dm.report.FindObject('mmGiveChange');
if c<> nil then
TfrxMemoView(c).Memo.Text := FormatCurr('0.00', OneTimePrint.billContent.change);

// 開始打印
dm.report.PrepareReport();
dm.report.Print;
except
// 打印失敗,重新加入任務隊列
Self.FPrintQueue.Enqueue(OneTimePrint);
end;
finally
FreeAndNil(dm);
end;
end;

Sleep(1);
end;
end;

end.

轉載于:https://www.cnblogs.com/hnxxcxg/p/5266512.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255810.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255810.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255810.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JAXB vs XStream

2019獨角獸企業重金招聘Python工程師標準>>> JAXB vs XStream 博客分類&#xff1a; java JAXB vs XStream 這兩東東本質上是有差別的&#xff0c;JAXB稱為OX binding工具&#xff0c;XStream應該算序列化工具&#xff0c;但OX binding工具也會marshall和unmarsha…

ABB 機器人 DRVIO_1通信報警

ABB 機器人DRVIO_1通信報警 2014.06.13 ABB1600弧焊機器人&#xff0c;從A地搬運到B地&#xff0c;到達B地后&#xff0c;機器人上電&#xff0c;報DRVIO_1通信故障&#xff0c;機器人進入故障停止模式。 DRVIO_1為LOCAL_GENERIC類型的ABB內部LOCAL總線類型的單元實例。 故障…

S2SH CRUD 整合

S2SH CRUD 整合 采用的框架 Struts2Spring4Hbiernate4. 目錄結構 &#xff1a; EmployeeAction: 1 package com.xx.ssh.actions;2 3 import java.io.ByteArrayInputStream;4 import java.io.InputStream;5 import java.io.UnsupportedEncodingException;6 import java.util.…

ABB 機器人 添加多任務

首先&#xff0c;需要啟用多任務選項的控制器。 要做到這一點&#xff0c;創建一個新的機器人控制器RobotStudio站 - >選擇機器人&#xff08;控制器菜單&#xff09; - >.................. - >系統生成器 - >選擇控制器 - >修改...下一頁 - >下一步 - >…

poj2594(二分圖,最小路徑覆蓋變形)

Treasure ExplorationTime Limit: 6000MS Memory Limit: 65536KTotal Submissions: 7611 Accepted: 3126Description Have you ever read any book about treasure exploration? Have you ever see any film about treasure exploration? Have you ever explored treasure? …

【機器視覺】——相機鏡頭篇

目錄 一、相關概念 1、相機 2、鏡頭 二、相關參數 1、相機參數 1)芯片尺寸

閉包(計算機科學)

在計算機科學中&#xff0c;閉包&#xff08;Closure&#xff09;又稱詞法閉包或函數閉包。是引用了自由變量的函數。這個被引用的自由變量將會和函數在一起。即使離開了創建它的環境也不例外。所以另一種關于閉包的說法&#xff1a;由函數和其引用相關的環境構成的實體。閉包在…

C語言小機器人

[cpp] view plaincopyprint? # include <stdio.h> # include <stdlib.h> # define MAXSTR 200 # define REBOT "小C說: " # define YOUR "您 說: " # define EXIT "-e\n" # define NOREPLY "我不知道你說什么呢…

分享12306搶票心得-終極秒殺思路篇

12306搶票的關鍵拼的就是整點出票的速度&#xff0c;快的幾秒鐘&#xff0c;慢的幾分鐘&#xff0c;本文提供終極搶票攻略&#xff0c;通過多線程掃描上萬個CDN&#xff0c;來大幅度提升出票速度。準備一&#xff1a;需要了解CDN和切站的機制&#xff0c;請參考&#xff1a;分享…

JVM內幕:Java虛擬機詳解

為什么80%的碼農都做不了架構師&#xff1f;>>> 這篇文章解釋了Java 虛擬機&#xff08;JVM&#xff09;的內部架構。下圖顯示了遵守 Java SE 7 規范的典型的 JVM 核心內部組件。 上圖顯示的組件分兩個章節解釋。第一章討論針對每個線程創建的組件&#xff0c;第二章…

【機器視覺】——光源篇(分類、選型)

目錄 ? 一、光源相關知識 1、光的作用 2、光的顏色 二、光源的種類

ABB機器人 系統參數配置

系統參數用于定義系統配置并在出廠時根據客戶的需要定義。 可使用 FlexPendant 或 RobotStudio Online 編輯系統參數。 此步驟介紹如何查看 系統參數配置。 操作 &#xff1a; 1. 在 ABB 菜單上&#xff0c;點擊控制面板。 2. 點擊配置。顯示選定主題的可用類型列表。 3. 點…

MFC BCGControlBar 庫 使用方法

安裝 BCGControlBar 庫到你的計算機&#xff1a; 解壓縮 BCGControlBar.zip &#xff08;比如&#xff0c;到 c:\bcg 目錄中&#xff09;把 c:\bcg\bin 增加到你的 path 環境變量中&#xff0c;運行 Visual C 并且打開 Tools | Options 對話框&#xff0c;切換到Directories 頁…

四則運算2開發簡介

四則運算2在四則運算1的基礎之上&#xff0c;又添加了新的功能&#xff0c;但是我覺得四則運算2的難度比四則運算1增大了很多&#xff0c;我在編程的過程中&#xff0c;遇到的最大難度就是不知該如何更好的融合各個功能之間的關系。 寫到現在&#xff0c;四則運算2主要實現了以…

ABB機器人的 備份與恢復

保存內容 備份功能可保存上下文中的所有系統參數、系統模塊和程序模塊。 備份內容 數據保存于用戶指定的目錄中。 默認路徑可加以設置。 目錄分為四個子目錄&#xff1a;Backinfo、Home、Rapid 和 Syspar。 System.xml 也保存于包含用戶設置的 ../backup &#xff08;根…

flask項目開發中,遇到http 413錯誤

在flask項目中&#xff0c;上傳文件時后臺報http 413 Request Entity Too Large 請求體太大錯誤&#xff01; 解決的2種方法&#xff1a; 1.在flask配置中設置 MAX_CONTENT_LENGTH的值; 如設置為20M ( MAX_CONTENT_LENGTH20*1024*1024) 這時小于20M的文件都可以上傳 相關連接&…

【機器視覺】——畸變與矯正

目錄 一、什么是畸變?畸變的原因是什么? 1、徑向畸變(桶形畸變和枕形畸變)

ApplicationContextAware 接口

一、這個接口有什么用&#xff1f; 當一個類實現了這個接口&#xff08;ApplicationContextAware&#xff09;之后&#xff0c;這個類就可以方便獲得ApplicationContext中的所有bean。換句話說&#xff0c;就是這個類可以直接獲取spring配置文件中&#xff0c;所有有引用到的be…

Java之泛型練習

package cn.itcast.generics;import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet;/** 方法一&#xff1a;實現Comparable接口*/ //class Person implements Comparable<Person> {//實現Comparable接口&#xff0c;使得集合元素具備可比較…