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

利用Thread來Render AVI檔案?

尚未結案
jovichs
一般會員


發表:5
回覆:0
積分:1
註冊:2005-10-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-02-13 14:45:00 IP:219.87.xxx.xxx 訂閱
這是我利用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.
系統時間:2024-05-17 16:03:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!