在开发一个平板点餐软件后台订单打印程序时,使用线程订单打印,为防打印阻塞使用临界区。
1 类: 2 3 type 4 MYPARA=record 5 title:pchar; //标题 6 str:pchar; 7 flag:integer; //标志 8 end; 9 PMYPARA=^MYPARA; 15 变量: ThreadId1:DWORD; 16 p:PMYPARA; 17 18 CSprintjz:TRTLCriticalSection; {临界区信息} 19 20 h2:THandle; 26 1.打印线程: 27 28 {初始化打印单据参数} 29 getmem(p,sizeof(p));//分配内存 30 p.title:='结帐单'; // 31 p.str:=''; //空 表示是第一次打印 32 p.flag:=0; 33 34 //开启线程: 36 h2:=CreateThread(nil, 0, @printjzdd,p,0, ThreadId1); 40 //线程函数printjzdd: 44 function printjzdd(Para:PMYPARA):integer;stdcall; 45 begin47 {进入打印线程的临界区} 48 EnterCriticalSection(CSprintjz); 49 result:=-1; 50 try 51 new( Pprintoneember); 52 Pprintoneember.No:=2; 53 Pprintoneember.tt:=pchar('');55 Pprintoneember.flag:=Para^.flag; 56 Pprintoneember.tdh:=g_tdh; 57 Pprintoneember.dd:=pchar(''); 58 Pprintoneember.Tno:=pchar(g_Tno); 59 {打印订单} 60 printdd_one(Pprintoneember); 61 62 MainForm.Memo1.Lines.Add('启动打印订单线程'); 63 except 64 LeaveCriticalSection(CSprintjz); 65 MainForm.Memo1.Lines.Add('启动打印订单线程err'); 66 exit; 67 end; 68 MainForm.Refreshzp(1); 69 MainForm.htsj(7);{统计营业额 } 70 LeaveCriticalSection(CSprintjz); 71 result:=1; 73 end;