多线程 – 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 解决方法
MultiThreadding不会加速您的媒体(HardDrive).
事实上,它可以通过并行写访问来减慢速度. 首先,您必须测量您的媒体(硬盘)是否能够在不到33毫秒内存储图像 – 因为每33.333毫秒您将从网络摄像头获得一个新图像. 如果没有,你不能期望这个运行. 你应该(和/或) >使用更多硬盘(例如每个线程一个) 如果你需要快速,不要浪费时间 if elElement<>NIL then begin JpegImg.Assign(elElement.bmWebcam) ; JpegImg.SaveToFile('Save' + elElement.sTime + '.jpg' ); elElement.Free; end else Sleep(20); OTL无助于让您的媒体更快,但会更清洁:o) 所以你应该看看 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |