加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

多线程 – Delphi并行编程 – 多线程慢

发布时间:2020-12-15 05:20:47 所属栏目:Java 来源:网络整理
导读:美好的一天, 网络摄像头类每秒大约有30帧,所有这些帧都将保存在矢量(如队列)中.然后3个异步线程将读取队列,并将尝试执行其工作(以保存这些图像).为什么队列溢出?所以问题是这些线程比网络摄像头慢. Procedure TSaveThread.Execute;begin while not terminat
美好的一天,

网络摄像头类每秒大约有30帧,所有这些帧都将保存在矢量(如队列)中.然后3个异步线程将读取队列,并将尝试执行其工作(以保存这些图像).为什么队列溢出?所以问题是这些线程比网络摄像头慢.

Procedure TSaveThread.Execute;
begin
   while not terminated  do
   begin
      elElement:=NIL;

      EnterCriticalSection(CritSect);
         if iElementsLength>=0 then
         begin
            elElement:=vElements[iElementsLength];
            Dec(iElementsLength);
         end;
      LeaveCriticalSection(CritSect);

      if elElement<>NIL then
      begin
         JpegImg.Assign(elElement.bmWebcam) ;
         JpegImg.SaveToFile('Save'+elElement.sTime+'.jpg') ;
         elElement.Free;
      end;

      Sleep(20);
   end;
end;

图像已添加到队列中.

//------------------------------------------------------------------------------
Procedure TWebcam.OnSave(Sender:TObject; bmWebcam:TBitmap);
begin
   EnterCriticalSection(CritSect);
      inc(iElementsLength);
      vElements[iElementsLength]:=TElement.Create(bmWebcam);
   LeaveCriticalSection(CritSect);
end;

创建线程.

for i:=0 to 2 do
    TSaveThread.Create(false);

问题是,这些线程无法保存所有这些图像.为什么?我怎样才能改进我的线程?

Delphi版本:Delphi XE2

网络摄像头框架尺寸:1280×760或960×600
这里的整个源代码:http://pastebin.com/8SekN4TE

解决方法

MultiThreadding不会加速您的媒体(HardDrive).

事实上,它可以通过并行写访问来减慢速度.

首先,您必须测量您的媒体(硬盘)是否能够在不到33毫秒内存储图像 – 因为每33.333毫秒您将从网络摄像头获得一个新图像.

如果没有,你不能期望这个运行.

你应该(和/或)

>使用更多硬盘(例如每个线程一个)
>使用更多缓存(例如缓存控制器)
>使用更快的硬盘(例如SSD)
>使用较小的图像(降低分辨率)
>放一些图像

如果你需要快速,不要浪费时间

if elElement<>NIL then
  begin
     JpegImg.Assign(elElement.bmWebcam) ;
     JpegImg.SaveToFile('Save' + elElement.sTime + '.jpg' );
     elElement.Free;
  end
else
  Sleep(20);

OTL无助于让您的媒体更快,但会更清洁:o)

所以你应该看看

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读