Delphi临界区的使用

在开发一个平板点餐软件后台订单打印程序时,使用线程订单打印,为防打印阻塞使用临界区。

类:

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;

时间: 2024-10-27 13:59:28

Delphi临界区的使用的相关文章

Delphi多线程编程(8)--多线程同步之CriticalSection(临界区)

转载自:万一的博客 先看一段程序 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1=class(TForm) ListBox1: TListBox; Button1: TButton; procedure FormCreate(Sender: TObject); procedure

Delphi多线程的OnTerminate属性(附加一个关于临界区线程同步的例子)

首先看TThread源码中关于OnTerminate的代码: public .... property OnTerminate: TNotifyEvent read FOnTerminate write FOnTerminate; ... end; 再看Delphi自带的帮助手册中对于OnTerminate的解释: Occurs after the thread's Execute method has returned and before the thread is destroyed. p

浅析Delphi Container库(有开源的DCLX)

与Java和C++相比,Delphi对容器的支持实在少得可怜.Java有强大的集合框架,C++更有STL,Delphi有什么呢,不就是TList几个小巧的列表类,而TCollection系列的类更多只是为了可视控件而存在的,真正意义上的容器类几乎没有.一日在Google上随意的敲上Delphi Container字样,没想到竟搜到一个SourceForge的开源项目,它在主页上是这样写的:DCLX(Delphi container library X)是一个免费的库,它提供了数组列表(Array

学习笔记:delphi多线程知识

最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处. Delphi的线程同步方法: 1.临界区 申明一个临界资源 FLock   : TRTLCriticalSection; 先初化一个临界资源对象InitializeCriticalSection(FLock)销毁临界资源对象DeleteCriticalSection(FLock) procedure TSaveThread.Pu

delphi 多线程2

多线程常用的内核对象:CreateEvent事件,CreateMutex互斥,CreateSemaphore信号,CreateWaitableTimer计时器 {建立事件} function CreateEvent( lpEventAttributes: PSecurityAttributes; {!} bManualReset: BOOL; bInitialState: BOOL; lpName: PWideChar ): THandle; stdcall; {建立互斥} function C

转-临界区对象TCriticalSection与TRTLCriticalSection的区别

TRTLCriticalSection是一个结构体,在windows单元中定义: 是InitializeCriticalSection, EnterCriticalSection, LeaveCriticalSection, DeleteCriticalSection 等这几个kernel32.dll中的临界区操作API的参数: TCriticalSection是在SyncObjs单元中实现的类,它对上面的那些临界区操作API函数 进行了了封装,简化并方便了在Delphi的使用: 如TCriti

delphi 各新版本特性收集

delphi 各新版本特性收集 Delphi XE6新增了一些特性并增强了原有的功能,主要有以下几个方面: IDE(整合开发环境) Internet XML(扩展标记语言) Compiler(编译器) COM/Active X Database support(数据库支持) CORBA Actions(动作) Custom Variants(可定义的可变类型) VCL 单元和特性 RTL单元和特性 Cross-platform development(跨平台开发) Translation too

Delphi 线程同步技术(转)

上次跟大家分享了线程的标准代码,其实在线程的使用中最重要的是线程的同步问题,如果你在使用线程后,发现你的界面经常被卡死,或者无法显示出来,显示混乱,你的使用的变量值老是不按预想的变化,结果往往出乎意料,那么你很有可能是忽略了线程同步的问题. 当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源.例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件中的字符数.当然,在把整个文件调入内存之前,统计它的计数是没有意义的.但是,由于每个操作都有自己的 线程,操作系统

Delphi多线程编程之同步读写全局数据

开始研究最重要的多线程读写全局数据了,结合书上的例子,我修改成下面的情况: unit Tst_Thread3U; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls; type   TForm1 = class(TForm)     Button1: TButton;     Memo1: TMemo;     Button2: TBu