我在程序中用TIMER创建并打开一个线程后,TIMER是每隔20秒运行一次,函数功能主要是在主界面上显示一个标题,但在程序运行后,我在程序界面录入数据时有时如果是刚好碰上TIMER调用线程时会出现这个错误提示,但不是每次录入数据时碰上都会出现提示,只是偶尔碰上就会提示,弄得我都不知道是在录入数据时产生的还是其它:
project Project1.exe raised exception class EoutOfResources with message"请求资源在使用中."Process stopped.Use step or Run to continue
但如果不动鼠标或不用键盘录入数据时他就一直都不会出现错误提示。是不是我的线程每次执行完后没释放完还是有其它冲突。这个是我的代码,请你帮我看一下,谢谢!
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Mask;type
  TForm1 = class(TForm)
    Image2: TImage;
    Timer1: TTimer;
    Button1: TButton;
    Image1: TImage;
    Button2: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    bz_bhsh:integer;
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}function pic_show(P:pointer):Longint;stdcall;
var
  newbmp: TBitmap;
  i, j, bmpheight, bmpwidth: integer;
begin
  form1.Image2.Visible := false;
  form1.Image2.Picture.LoadFromFile('c:\threaD\dy_7a.bmp');
  newbmp := TBitmap.Create;
  newbmp.Transparent := True;
  newbmp.Width := form1.Image2.Width;
  newbmp.Height := form1.Image2.Height;
  bmpheight := form1.Image2.Height;
  bmpwidth := form1.Image2.Width;
  if form1.bz_bhsh < 5 then begin
    case form1.bz_bhsh of
      1: begin
          i := 0;
          while i <= bmpheight do begin
            j := i;
            while j > 0 do begin
              newbmp.Canvas.CopyRect(Rect(0, j - 1, bmpwidth, j), form1.Image2.Canvas, Rect(0, bmpheight - i + j - 1, bmpwidth, bmpheight - i + j));
              newbmp.Canvas.CopyRect(Rect(0, bmpheight - j, bmpwidth, bmpheight - j + 1), form1.Image2.Canvas, Rect(0, i - j, bmpwidth, i - j + 1));
              j := j - 1;
            end;
            form1.Canvas.Draw(97, 0, newbmp);
            i := i + 1;
          end;
        end;
      2: begin
          for i := 0 to bmpheight do begin
            newbmp.Canvas.CopyRect(Rect(0, bmpheight - i, bmpwidth, bmpheight), form1.Image2.Canvas, Rect(0, 0, bmpwidth, i));
            form1.Canvas.Draw(97, 0, newbmp);
          end;
        end;
      3: begin
          i := 0;
          while i <= bmpwidth do begin
            j := i;
            while j > 0 do begin
              newbmp.Canvas.CopyRect(Rect(j - 1, 0, j, bmpheight), form1.Image2.Canvas, Rect(bmpwidth - i + j - 1, 0, bmpwidth - i + j, bmpheight));
              newbmp.Canvas.CopyRect(Rect(bmpwidth - j, 0, bmpwidth - j + 1, bmpheight), form1.Image2.Canvas, Rect(i - j, 0, i - j + 1, bmpheight));
              j := j - 2;
            end;
            form1.Canvas.Draw(97, 0, newbmp);
            i := i + 2;
          end;
         end;
      4: begin
          i := bmpheight;
          while i > 0 do begin
            for j := 10 to i do begin
              newbmp.Canvas.CopyRect(Rect(0, j - 10, bmpwidth, j), form1.Image2.Canvas, Rect(0, i - 10, bmpwidth, i));
              form1.Canvas.Draw(97, 0, newbmp);
            end;
            i := i - 10;
          end;        end;
    end;
    form1.bz_bhsh := form1.bz_bhsh + 1;
  end
  else begin
    form1.bz_bhsh := 1;
  end;
  newbmp.Transparent := False;
  newbmp.Free;
  form1.Image2.Visible := True;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
  bz_bhsh:=1;
end;procedure TForm1.Timer1Timer(Sender: TObject);
var
  hThread:Thandle;
  ThreadID:DWord;
begin
   CreateThread(nil,0,@pic_show,nil,0,ThreadID);
end;procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  pic_show(nil);
end;end.

解决方案 »

  1.   

    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      hThread:Thandle;
      ThreadID:DWord;
    begin
       CreateThread(nil,0,@pic_show,nil,0,ThreadID);
    end;
    // 应该是你这个pic_show函数的问题,
    看看是不是多次LoadFromFile....
      

  2.   

    这个不用THREAD,感觉;你直接在你的TIMER里调用你的过程就OK
      

  3.   

    我也不想用线程,但因为朋友的机器比较慢,用TIMER经常要等动画标题完了以后才能录入数据,所以我才想到用线程的。