利用Thread來Render AVI檔案? |
尚未結案
|
jovichs
一般會員 發表:5 回覆:0 積分:1 註冊:2005-10-17 發送簡訊給我 |
這是我利用thread的方式來render AVI 檔案(使用DSPACK),當第一次按鈕的時候,程式是正確的(Edit1的數值不會停頓),可是第二次按鈕的時候,Edit1的數值會暫停2~3秒表示thread沒有正確執行,有人可以幫我解答嗎?
unit position; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DSPack,DirectShow9, JvComponentBase, JvThreadTimer; type TMyThread=class(TThread) FG: TFilterGraph; PlayFile:String; protected procedure Execute; override; procedure HideWindow; public constructor Create; destructor Destroy; override; end; TForm1 = class(TForm) FilterGraph1: TFilterGraph; VideoWindow1: TVideoWindow; FilterGraph2: TFilterGraph; VideoWindow2: TVideoWindow; Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; JvThreadTimer1: TJvThreadTimer; Edit1: TEdit; Button5: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure JvThreadTimer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button5Click(Sender: TObject); private { Private declarations } public { Public declarations } NowPlay:integer; end; var Form1: TForm1; MyThread1,MyThread2:TMyThread; implementation {$R *.dfm} constructor TMyThread.Create; begin inherited Create(True); FreeOnTerminate := false; FG := TFilterGraph.Create(nil); end; destructor TMyThread.Destroy; begin if(not Terminated)then Terminate; FG.Free; inherited; end; procedure TMyThread.HideWindow; var PosStop, PosCurr,Pos : Int64; MediaSeeking: IMediaSeeking; begin try if Succeeded(FG.QueryInterface(IMediaSeeking, MediaSeeking)) then begin MediaSeeking.GetPositions(PosCurr, PosStop); Pos:=0; MediaSeeking.SetPositions(Pos, AM_SEEKING_AbsolutePositioning, PosCurr, AM_SEEKING_NoPositioning); if(Form1.NowPlay=1)then Form1.VideoWindow1.Visible:=false else Form1.VideoWindow2.Visible:=false; end; finally MediaSeeking:= nil; end; end; procedure TMyThread.Execute; begin FG.RenderFile(PlayFile); Synchronize(HideWindow); end; procedure TForm1.Button1Click(Sender: TObject); begin NowPlay:=1; if not assigned(MyThread1) then MyThread1:=TMyThread.Create; MyThread1.PlayFile:='c:\a.avi'; MyThread1.FG:=FilterGraph1; if not MyThread1.FG.Active then MyThread1.FG.Active:=true; MyThread1.FG.ClearGraph; if(MyThread1.Suspended)then MyThread1.Resume else MyThread1.Execute; end; procedure TForm1.Button2Click(Sender: TObject); begin FilterGraph1.Play; end; procedure TForm1.Button3Click(Sender: TObject); begin NowPlay:=2; if not assigned(MyThread2) then MyThread2:=TMyThread.Create; MyThread2.PlayFile:='c:\b.avi'; MyThread2.FG:=FilterGraph2; if not MyThread2.FG.Active then MyThread2.FG.Active:=true; MyThread2.FG.ClearGraph; if(MyThread2.Suspended)then MyThread2.Resume else MyThread2.Execute; end; procedure TForm1.Button4Click(Sender: TObject); begin FilterGraph2.Play; end; procedure TForm1.JvThreadTimer1Timer(Sender: TObject); begin Edit1.Text:=inttostr(strtoint(Edit1.Text) 1); end; procedure TForm1.FormCreate(Sender: TObject); begin NowPlay:=1; end; procedure TForm1.Button5Click(Sender: TObject); begin if(assigned(MyThread1))then begin MyThread1.FG.ClearGraph; MyThread1.Free; end; if(assigned(MyThread2))then begin MyThread2.FG.ClearGraph; MyThread2.Free; end; close; end; end. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |