在开发一个平板点餐软件后台订单打印程序时,使用线程订单打印,为防打印阻塞使用临界区。
类:
type
MYPARA=record
title:pchar; //标题
str:pchar;
flag:integer; //标志
end;
PMYPARA=^MYPARA;
变量: ThreadId1:DWORD;
p:PMYPARA;
CSprintjz:TRTLCriticalSection; {临界区信息}
h2:THandle;
1.打印线程:
{初始化打印单据参数}
getmem(p,sizeof(p));//分配内存
p.title:=‘结帐单‘; //
p.str:=‘‘; //空 表示是第一次打印
p.flag:=0;
开启线程:
h2:=CreateThread(nil, 0, @printjzdd,p,0, ThreadId1);
线程函数printjzdd:
function printjzdd(Para:PMYPARA):integer;stdcall;
begin
//showmessage(pchar(lp));
{进入打印线程的临界区}
EnterCriticalSection(CSprintjz);
result:=-1;
try
new( Pprintoneember);
Pprintoneember.No:=2;
Pprintoneember.tt:=pchar(‘‘);
// Pprintoneember.tt:=Para^.str; //tt.转为 补打
Pprintoneember.flag:=Para^.flag;
Pprintoneember.tdh:=g_tdh;
Pprintoneember.dd:=pchar(‘‘);
Pprintoneember.Tno:=pchar(g_Tno);
{打印订单}
printdd_one(Pprintoneember);
MainForm.Memo1.Lines.Add(‘启动打印订单线程‘);
except
LeaveCriticalSection(CSprintjz);
MainForm.Memo1.Lines.Add(‘启动打印订单线程err‘);
exit;
end;
MainForm.Refreshzp(1);
MainForm.htsj(7);{统计营业额 }
LeaveCriticalSection(CSprintjz);
result:=1;
end;