如何減少Application.ProcessMessage的時間 |
答題得分者是:pcplayer99
|
frog1
一般會員 發表:25 回覆:40 積分:18 註冊:2007-01-24 發送簡訊給我 |
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 为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 發送簡訊給我 |
感謝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 發送簡訊給我 |
|
frog1
一般會員 發表:25 回覆:40 積分:18 註冊:2007-01-24 發送簡訊給我 |
|
歸木淡
中階會員 發表:1 回覆:49 積分:75 註冊:2005-09-07 發送簡訊給我 |
雖然影像處理比較慢, 但是你的第二步所用的時間不太正常, 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 發送簡訊給我 |
|
frog1
一般會員 發表:25 回覆:40 積分:18 註冊:2007-01-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |