全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3127
推到 Plurk!
推到 Facebook!

如何減少Application.ProcessMessage的時間

答題得分者是:pcplayer99
frog1
一般會員


發表:25
回覆:40
積分:18
註冊:2007-01-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-09 22:00:08 IP:219.81.xxx.xxx 訂閱
Hi,各位前輩
我作了一個截取百萬像素監視器轉存AVI程式, AVI的Frame數每秒要15張(每張約66毫秒)
我的程序大約是如此
1.取像 用IJL將Jpg轉Bmp
2.在營幕上顯示圖像
3.用AviWrite將Bmp寫入 AVI檔
經用GetTickCount追踪各段時間 程序1 為46毫秒, 程序2為0毫秒, 程序3 為16毫秒, 如此我應可在 66毫秒內完成
可是實際AVI每分鐘卻只有錄成40秒, 即100秒才完成一個循環
經查驗才發現Application.ProcessMessage用掉了約40毫秒, 可是不加Application.ProcessMessage, 圖像就無法顯示
而且人員無法作任何的操作(如離開...)
爬文許久, 都是提到Application.ProcessMessage的功能及用法, 但找不到我問題答案
不知各位前輩有方法降低此時間的作法, 或有其他的解法, 懇請指點
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-10 10:20:38 IP:116.24.xxx.xxx 訂閱
2 为0毫秒,但如果不加 Application.ProcessMessage 则不显示,说明 2 实际需要的是 Application.ProcessMessage 的时间嘛。

Application.ProcessMessage 实际上就是执行 VCL 主线程里的代码,让整个程序处理该处理的消息。如果你现实图像用的是 VCL 比如 TIMAGE,那么,就必须要让 VCL 主线程工作来刷新屏幕。如果屏幕不刷新,连 FORM 上的文字更新都不会更新的。比如你做一个如下的代码:

for i := 0 to 900000 do Label1.Caption := IntToStr(i);

在这个 for 循环里,代码一直在执行,就没有机会让 VCL 主线程处理系统消息,因此,尽管 Label1.Label 被改变了,但 FORM 上的现实并不会改变。而且在整个循环期间,FORM 都会停止对鼠标键盘的响应 --- 程序无法处理 WINDOWS 消息嘛。如果你在循环中间加上 Application.ProcessMessage 则是强迫程序在循环的时候处理系统消息,这样 Form 上的 Label1.Caption 的改变就会显示出来。

解决你的问题有3个方面:
1. 如果的确是机器忙不过来,比如写硬盘需要足够的时间,你需要考虑改善这部分。比如我见过类似系统,先把硬盘格式化并写入空白文件,使得文件碎块尽量少来达到写硬盘速度更快的目的;
2. 弹就显示来看,如果你仍然采用 VCL 主线程来显示,根据你的描述,显示非常耗时,那么,你是否考虑过减少显示的帧数。你要的是【保存】,保存30帧,但只显示15帧,视觉效果上没问题,保存液没有丢帧。
3. 如果用显示卡硬件加速,是否能提高显示的速度?这里,需要考虑用 DirectShow 的技术,在 DELPHI 来说,就是要用 DsPack 那套控件。当然,如果不懂 DirectShow 和 COM 的原理,那套控件你用不好。使用了 DirectShow 以后是否能提高显示的效率,我不清楚,不能给出肯定的答案。但你可以去试验。

===================引 用 frog1 文 章===================
Hi,各位前輩
我作了一個截取百萬像素監視器轉存AVI程式, AVI的Frame數每秒要15張(每張約66毫秒)
我的程序大約是如此
1.取像 用IJL將Jpg轉Bmp
2.在營幕上顯示圖像
3.用AviWrite將Bmp寫入 AVI檔
經用GetTickCount追踪各段時間 程序1 為46毫秒, 程序2為0毫秒, 程序3 為16毫秒, 如此我應可在 66毫秒內完成
可是實際AVI每分鐘卻只有錄成40秒, 即100秒才完成一個循環
經查驗才發現Application.ProcessMessage用掉了約40毫秒, 可是不加Application.ProcessMessage, 圖像就無法顯示
而且人員無法作任何的操作(如離開...)
爬文許久, 都是提到Application.ProcessMessage的功能及用法, 但找不到我問題答案
不知各位前輩有方法降低此時間的作法, 或有其他的解法, 懇請指點
frog1
一般會員


發表:25
回覆:40
積分:18
註冊:2007-01-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-04-10 11:15:24 IP:219.81.xxx.xxx 訂閱
感謝pcplayer99的指點, 我的狀況就如所說, 不加 Application.ProcessMessage, 圖像是不會顯示

因我每秒轉15個Frame數, 在貯存方面只有AVI, 應不是問題, 而我雖轉15個Frame, 但在營幕顯示時, 只顯示7個
而追踪Application.ProcessMessage的時間大約是 5次36mSec,一次109mSec, 但不知他是在做什麼

所以Application.ProcessMessage的時間大部份,就是在處理顯示 圖像的時間嗎
我的顯示方式是用Delphi本身元件 TImage來做的, 而且Stretch = Ture, 這是否會較耗時

如我加顯示片或改用Dspack的顯示方式, 就可以解決我的問題了, 對嗎
可否再給我一次解答,


taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-04-10 11:22:17 IP:118.169.xxx.xxx 訂閱
你是用VFW嗎?
為什麼不是[攝影機]->[AVI]->[BMP]->[JPG]
而是
[攝影機]->[JPG]->[BMP]->[AVI]
frog1
一般會員


發表:25
回覆:40
積分:18
註冊:2007-01-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-04-10 13:07:24 IP:219.81.xxx.xxx 訂閱
Hi,
不是用VFW, 當初有找過 VFW, 但忘了什麼原因就沒用他
我用的是IP Camera 提供的是JPG檔, VFW可以吃JPG嗎, 也許這可是個方向, 我試一下

歸木淡
中階會員


發表:1
回覆:49
積分:75
註冊:2005-09-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-04-23 12:48:39 IP:99.156.xxx.xxx 訂閱
雖然影像處理比較慢, 但是你的第二步所用的時間不太正常, 36ms 刷新一副圖, 太長
我想有幾個地方可以改善:
1)Stretch = True 絕對是不應該的, 因為放縮很費很費計算,這可能是主要原因
2)如何你用了Image1.picture.assign(bmp), 可以考慮用Image1.canvas.draw(0,0,bmp), 直接把圖畫上去
3)如pcplayer99所說, Skip frames, 每兩或三frames才更新一次image1, 每次更新後Application.ProcessMessage
4)可以的話, 把程序三放在thread中, 可能有幫助, 不過很煩
frog1
一般會員


發表:25
回覆:40
積分:18
註冊:2007-01-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-04-23 16:05:18 IP:219.86.xxx.xxx 訂閱
Hi, 
感謝前輩的指點
經上次pcplayer99及taishyang的指點後, 已買了一顯示卡(想這是最省時間的, 其他的方式, 有空再學)
只是拿到顯示卡後監視器就不在手上, 沒法試, 所以一直未結案, 這兩天可有結果
提到不要用Image1.Stretch := True;可是圖像要在固定的大小中全部顯示, 不知可否有其他的方式
再請前輩們指點

frog1
一般會員


發表:25
回覆:40
積分:18
註冊:2007-01-24

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-04-28 11:37:05 IP:219.86.xxx.xxx 訂閱
Hi, 
感謝各位前輩的指點
加了顯示卡測試Application.ProcessMessage的時間減到低於10
但可能我程式中有其他問題, 整體來說完成的張數沒提昇, 但這應是另一問題, 就先結案
感謝指點, 但因時間及能力就直接採用pcplayer99的方案, 其餘的我會再學習,
就把分數給pcplayer99
系統時間:2024-11-22 22:28:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!