已经实现了抓取摄像头的图像,并存为缩小的jpg图片,但是怎么实现一按下“捕捉图片”的按钮后就可以每隔10秒刷新捕捉的图像,在按下就可以停止呢?我没用过线程和定时器,所以麻烦各位说的清除些,我下面的代码用了sleep(5000),估计sleep把整个程序组塞了,造成了假死的现象procedure TForm1.Button3Click(Sender: TObject);
var
  jpg :TJpegImage;
  bmp :TBitMap;
  name:String;
  nameid:String;
  tmp:String;
  begin
  name:=ComboBox1.Text;
  nameid:=IntToStr(ComboBox1.ItemIndex+1);
while(true) do
begin
if hWndC <> 0 then begin
SendMessage(hWndC,WM_CAP_SAVEDIB,0,longint(pchar(nameid+'.bmp')));
 // jpg.Create;
 jpg:=TJpegImage.Create;
  bmp:=TBitMap.Create;
  bmp.LoadFromFile(nameid+'.bmp');
  bmp.Canvas.Brush.Style := bsClear;
  bmp.Canvas.Font.Color := clRed;
  bmp.Canvas.Font.Size := 20;
  bmp.Canvas.Font.Name:='宋体';
  bmp.Canvas.Font.Size:=9;
  bmp.Canvas.TextOut((bmp.Width div 2 - 30),(0),name);  bmp.Canvas.TextOut(0,(bmp.Height-10),DateTimeToStr(Now));  image2.Picture.Bitmap.Assign(bmp);
  jpg.Assign(bmp);
  jpg.SaveToFile(nameid+'a.jpg');
  jpg.Free;
  bmp.Free;
  jpg:= StretchImagePercent(nameid+'a.jpg',50,100);
  jpg.SaveToFile(nameid+'.jpg');
  jpg.Free;
end;
  sleep(5000);
end;
end;

解决方案 »

  1.   


    Procedure Delay(Msecs:Integer);
    var FirstTickCount : real;
    begin
      FirstTickCount := GetTickCount;
      Repeat
        Application.ProcessMessages;
      Until ((GetTickCount - FirstTickCount) >= LongInt (Msecs));
    end;用这个延时看看。
      

  2.   

    Use "DSPack DirectX Show 多媒体 DVD 抓图 控件包",Everything about Vedio will become very easy.
      

  3.   

    用一个timer()来实现等待很简单的,把抓图的函数放到ontimer事件中,就可以了;
      

  4.   

    就是,设好TIMER的间隔时间,毫秒单位。
    ENABLE := True启动
    ontimer事件中写抓图函数。
    试试就知道效果了。
    ENABLE := False停止