我的程序首先创建了一个TMemoryStream内存区, 有两个定时器,一个从数据库提取数据写入到该内存区;另外一个定时器从该内存区读取数据,并根据反馈信息修改内存区的部分内容。由于两个定时器同时修改同一内存区,导致程序出错。现在需要锁定该内存区,每次只供一个线程(定时器相当于线程)访问该内存区,如何实现?如何取得给内存区的句柄?interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Timer2: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private declarations }
    FBuf: TMemoryStream;  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
  FBuf:= TMemoryStream.Create;end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
  //
end;procedure TForm1.Timer2Timer(Sender: TObject);
begin
  //
end;end.

解决方案 »

  1.   

    如果你的 Timer事件处理中没有调用 Application.ProcessMessages,不会发生正在处理中又发生另一个Timer事件的情况
      

  2.   

    To: jiangsheng
        代码锁定已经试过了,增加了一个TCriticalSection进行锁定,但是故障依旧To:ahjoe
        我这段程序在其中一个定时器有大量内存操作时,另外一个定时器就会抛出异常:Access violation at address 0058BD2F in module 'Msg.exe'. Read of address 7FE97856大家还有没有好的建议或者方法?谢了先!
      

  3.   

    新建一个消息, 在Timer事件中PostMessage给自己, 在消息处理函数中处理实际事务, 当然,你还可以同时使用TCriticalSection
      

  4.   

    就一个线程TCriticalSection有毛用
      

  5.   

    Timer是基于主线程消息的,需要锁定吗?应该是你内存操作越界了。