type TMyThread = class(TThread) private fStatusText : string; procedure ShowStatus; protected procedure Execute; override; public Constructor Create(CreateSuspended : boolean); Hbk: TProcess; M: TmemoryStream; n: longInt; BytesRead: longInt; end;
constructor TMyThread.Create(CreateSuspended : boolean); begin FreeOnTerminate := True; inherited Create(CreateSuspended); end; procedure TMyThread.ShowStatus; // this method is executed by the mainthread and can therefore access all GUI elements. begin frmMain.Caption := fStatusText; end; procedure TMyThread.Execute; begin Hbk.CommandLine := 'HandbrakeCLI -i ' + '"' + frmMain.txtInput.Text + '"' + ' -t 0'; Hbk.Options := [poUsePipes, poStderrToOutPut]; Hbk.ShowWindow := swoHide; Hbk.Execute; while Hbk.running do begin M.SetSize(BytesRead + READ_BYTES); n := Hbk.Output.Read((M.Memory + BytesRead)^, READ_BYTES); if n > 0 then begin Inc(BytesRead,n); fStatusText := FormatDateTime('YYYY-MM-DD HH:NN:SS',Now); synchronize(@ShowStatus); end; end; repeat synchronize(@ShowStatus); M.SetSize(BytesRead + READ_BYTES); n := Hbk.Output.Read((M.Memory + BytesRead)^, READ_BYTES); if n > 0 then begin Inc(BytesRead,n); end; until n <= 0; M.SetSize(BytesRead); end;
procedure TfrmMain.btnScanClick(Sender: TObject);begin if txtInput.Text = '' then exit; iThread.Resume; iThread.Execute; HbkStr.LoadFromStream(iThread.M); iThread.Terminate; mmoOutputs.Lines.Clear; mmoOutputs.Lines.BeginUpdate; mmoOutputs.Lines.AddStrings(Hbkstr); mmoOutputs.Lines.EndUpdate;end;
type TMyThread = class(TThread) private fStatusText : string; procedure ShowStatus; procedure Scan; protected procedure Execute; override; public Constructor Create(CreateSuspended : boolean); Hbk: TProcess; M: TmemoryStream; n: longInt; BytesRead: longInt; doScan: boolean; end;
constructor TMyThread.Create(CreateSuspended : boolean); begin FreeOnTerminate := True; inherited Create(CreateSuspended); end; procedure TMyThread.ShowStatus; begin frmMain.Caption := fStatusText; end; procedure TMyThread.Scan; begin Hbk.CommandLine := 'HandbrakeCLI -i ' + '"' + frmMain.txtInput.Text + '"' + ' -t 0'; Hbk.Options := [poUsePipes, poStderrToOutPut]; Hbk.ShowWindow := swoHide; Hbk.Execute; while Hbk.running do begin M.SetSize(BytesRead + READ_BYTES); n := Hbk.Output.Read((M.Memory + BytesRead)^, READ_BYTES); if n > 0 then begin Inc(BytesRead,n); fStatusText := FormatDateTime('YYYY-MM-DD HH:NN:SS',Now); synchronize(@ShowStatus); end; end; repeat synchronize(@ShowStatus); M.SetSize(BytesRead + READ_BYTES); n := Hbk.Output.Read((M.Memory + BytesRead)^, READ_BYTES); if n > 0 then begin Inc(BytesRead,n); end; until n <= 0; M.SetSize(BytesRead); frmMain.HbkStr.LoadFromStream(M); frmMain.mmoOutputs.Lines.Clear; frmMain.mmoOutputs.Lines.BeginUpdate; frmMain.mmoOutputs.Lines.AddStrings(frmMain.Hbkstr); frmMain.mmoOutputs.Lines.EndUpdate; fStatusText := 'Finished'; Synchronize(@ShowStatus); end;
procedure TfrmMain.btnScanClick(Sender: TObject);begin iThread.doScan := true; iThread.Resume;end; procedure TfrmMain.FormCreate(Sender: TObject);begin HbkStr := TStringList.Create; iThread := TMyThread.Create(True); iThread.M := TMemoryStream.Create; iThread.Hbk := TProcess.Create(nil); iThread.BytesRead := 0;end;procedure TfrmMain.FormDestroy(Sender: TObject);begin iThread.Hbk.Free; HbkStr.Free; iThread.M.Free; iThread.Terminate; iThread.Free; inherited;end;
how to call the execute of tthread again when i clicked the scan button here is the updated code
procedure TfrmMain.btnScanClick(Sender: TObject);begin if iThread.Terminated then begin iThread.Execute; end else begin iThread.doScan := true; iThread.Resume; end;end
constructor TMyThread.Create(CreateSuspended : boolean); begin FreeOnTerminate := False; inherited Create(CreateSuspended); end;
procedure TfrmMain.btnScanClick(Sender: TObject);begin if iThread.Terminated = true then begin iThread.Execute; end else begin iThread.doScan := true; iThread.Resume; end;end;
unit Unit1; {$mode objfpc}{$H+}interfaceuses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;type { TForm1 } TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure ThreadTerminated(Sender: TObject); private { private declarations } public { public declarations } end; { TMyThread } TMyThread = class(TThread) private FSomeInData: string; FSomeOutData: string; protected procedure Execute; override; public property SomeOutData: string read FSomeOutData; property SomeInData: string write FSomeInData; end;var Form1: TForm1; implementation{$R *.lfm}{ TForm1 }procedure TForm1.Button1Click(Sender: TObject);var AThread:TMyThread;begin AThread:=TMyThread.Create(True); AThread.FreeOnTerminate:=true; AThread.SomeInData:='Current Time '; AThread.OnTerminate:=@ThreadTerminated; AThread.Resume;end;procedure TForm1.ThreadTerminated(Sender: TObject);begin ShowMessage((Sender as TMyThread).SomeOutData);end;{ TMyThread }procedure TMyThread.Execute;begin Sleep(1000); //Wait a little FSomeOutData:=FSomeInData+TimeToStr(Now);end;end.
scanThread.sPro := TProcess.Create(nil); scanThread.M := TMemoryStream.Create; scanThread.BytesRead := 0; scanThread.audioCount := 0; scanThread.i := 0; scanThread.scanned := false; //tmrScan.Enabled := true; btnEncode.Enabled := false; scanThread.Resume;
procedure TMyThread.Scan;const READ_BYTES = 2048;var x : integer; audioTracks: string;begintry audioTracks := ''; frmMain.prgScan.StepIt; if frmMain.prgScan.Position = frmMain.prgScan.Max then frmMain.prgScan.Position := frmMain.prgScan.Min; if (scanned = false) and (i <= frmMain.lstAdd.Items.Count - 1) then begin sPro.CommandLine := 'HandbrakeCLI -i ' + '"' + frmMain.lstAdd.Items[i] + '"' + ' -t 0'; sPro.Options := [poUsePipes, poStderrToOutPut]; sPro.ShowWindow := swoShow; sPro.Execute; while sPro.running do begin M.SetSize(BytesRead + READ_BYTES); n := sPro.Output.Read((M.Memory + BytesRead)^, READ_BYTES); if n > 0 then begin Inc(BytesRead,n); end; end; repeat M.SetSize(BytesRead + READ_BYTES); n := sPro.Output.Read((M.Memory + BytesRead)^, READ_BYTES); if n > 0 then begin Inc(BytesRead,n); end; until n <= 0; M.SetSize(BytesRead); frmMain.HbkStr.LoadFromStream(M); if frmMain.HbkStr.IndexOf('No title found.') <> -1 then begin scanned := true; exit; end; audioCount := 0; x := frmMain.HbkStr.IndexOf(' + audio tracks:') + 1; repeat x := x + 1; AudioCount := AudioCount + 1; until (x = frmMain.HbkStr.Count - 1) or (x = frmMain.HbkStr.IndexOf(' + subtitle tracks:')) ; for x := 1 to AudioCount do begin audioTracks := audioTracks + intToStr(x); if x <> AudioCount then audioTracks := audioTracks + ','; end; if frmMain.chkHardSubs.Checked = true then begin frmMain.lstOut.Items.add('HandbrakeCLI -i ' + '"' + trim(frmMain.lstAdd.Items[i]) + '" ' + ' -f mkv -o ' + '"' + trim(frmMain.lstAdd.Items[i]) + '-OUT.mkv' + '" ' + venString + trim(frmMain.txtVideoValue.Text) + ' -e x264 -x ' + x264String + ' -E vorbis -B '+ trim(frmMain.txtAudioValue.Text) + ' -w ' + trim(frmMain.txtWidth.Text) + ' -l ' + trim(frmMain.txtHeight.Text) + ' -s 1 --subtitle-burn 1' + ' -a ' + audioTracks); end else if frmMain.chkHardSubs.Checked = false then begin frmMain.lstOut.Items.add('HandbrakeCLI -i ' + '"' + trim(frmMain.lstAdd.Items[i]) + '" ' + ' -f mkv -o ' + '"' + trim(frmMain.lstAdd.Items[i]) + '-OUT.mkv' + '" ' + venString + trim(frmMain.txtVideoValue.Text) + ' -e x264 -x ' + x264String + ' -E vorbis -B '+ trim(frmMain.txtAudioValue.Text) + ' -w ' + trim(frmMain.txtWidth.Text) + ' -l ' + trim(frmMain.txtHeight.Text) + ' -a ' + audioTracks); end; scanned := true; end; if (scanned = true) and (i <= frmMain.lstAdd.Items.Count - 1) and (sPro.Running = false) then begin i := i + 1; scanned := false; end; if (scanned = false) and (i = frmMain.lstAdd.Items.Count)then begin //frmMain.tmrScan.Enabled := false; ShowMessage('Scanning Done'); frmMain.btnEncode.Enabled := true; scanned := true; frmMain.prgScan.Position := frmMain.prgScan.Min; frmMain.lstAdd.Clear; frmMain.tbsOutput.Show; //sPro.Free; //M.Free; end;except on E : Exception do ShowMessage(E.Message);end;end;
procedure TfrmMain.btnEnqueueClick(Sender: TObject);var scanThread : TMyThread;begin scanThread := TMyThread.Create(True); scanThread.venString := ''; scanThread.x264String := ''; if (cboMode.Text = 'CRF') and (txtVideoValue.Text <> '') then begin scanThread.venString := '-q '; end else if (cboMode.Text = 'Bitrate') and (txtVideoValue.Text <> '') then begin scanThread.venString := '-2 -b '; end else if (cboMode.text = 'File Size') and (txtVideoValue.Text <> '') then begin scanThread.venString := '-2 -S '; end; try if (strToInt(txtVideoValue.Text) < 10) and (cboMode.Text = 'CRF') then begin showmessage('CRF value must be >= 20 and <= 33'); txtVideoValue.Text := ''; txtVideoValue.SetFocus; end; except Exit; end; try if (strToInt(txtAudioValue.Text) < 10) then begin showmessage('Audio bitrate must be not less than 48'); txtAudioValue.text := ''; txtAudioValue.SetFocus; end; except Exit; end; if rbHigh.Checked = true then begin scanThread.x264String := 'deblock=1,1:ref=8:bframes=5:me=umh:subme=10:trellis=2:psy-rd=0.4:aq-strength=0.6:aq-mode=2'; end else if rbMedium.Checked = true then begin scanThread.x264String := 'deblock=1,1:ref=5:bframes=3:me=umh:subme=8:trellis=1:psy-rd=0.4:aq-strength=0.6'; end else if rbLow.Checked = true then begin scanThread.x264String := 'deblock=1,1:ref=3:bframes=3:trellis=1:psy-rd=0.4:aq-strength=0.6'; end; if lstAdd.items.count = 0 then exit; if (txtVideoValue.text <> '') and (txtAudioValue.Text <> '') and (txtWidth.Text <> '') and (txtHeight.text <> '') then begin scanThread.sPro := TProcess.Create(nil); scanThread.M := TMemoryStream.Create; scanThread.BytesRead := 0; scanThread.audioCount := 0; i := 0; scanThread.scanned := false; //tmrScan.Enabled := true; btnEncode.Enabled := false; scanThread.Resume; end;end;
TMyThread = class(TThread) private procedure Scan; procedure iUpdate; procedure prgUpdate; protected procedure Execute; override; public scanned: boolean; audioCount: integer; venString: string; x264String: string; sPro: TProcess; M: TmemoryStream; n: longInt; BytesRead: longInt; end;
implementationprocedure TMyThread.Execute;begin Scan;end;procedure TMyThread.iUpdate;begin frmMain.i := frmMain.i + 1;end;procedure TMyThread.prgUpdate;begin frmMain.prgScan.StepIt; if frmMain.prgScan.Position = frmMain.prgScan.Max then frmMain.prgScan.Position := frmMain.prgScan.Min;end; procedure TMyThread.Scan;const READ_BYTES = 2048;var x : integer; audioTracks: string;begin audioTracks := ''; if (scanned = false) and (frmMain.i < frmMain.lstAdd.Items.Count) then begin sPro.CommandLine := 'HandbrakeCLI -i ' + '"' + frmMain.lstAdd.Items[frmMain.i] + '"' + ' -t 0'; sPro.Options := [poUsePipes, poStderrToOutPut]; sPro.ShowWindow := swoShow; sPro.Execute; while sPro.running do begin M.SetSize(BytesRead + READ_BYTES); n := sPro.Output.Read((M.Memory + BytesRead)^, READ_BYTES); if n > 0 then begin Inc(BytesRead,n); Synchronize(@prgUpdate); end; end; repeat Synchronize(@prgUpdate); M.SetSize(BytesRead + READ_BYTES); n := sPro.Output.Read((M.Memory + BytesRead)^, READ_BYTES); if n > 0 then begin Inc(BytesRead,n); end; until n <= 0; M.SetSize(BytesRead); frmMain.HbkStr.LoadFromStream(M); if frmMain.HbkStr.IndexOf('No title found.') <> -1 then begin scanned := true; exit; end; audioCount := 0; x := frmMain.HbkStr.IndexOf(' + audio tracks:') + 1; repeat x := x + 1; AudioCount := AudioCount + 1; Synchronize(@prgUpdate); until (x = frmMain.HbkStr.Count - 1) or (x = frmMain.HbkStr.IndexOf(' + subtitle tracks:')) ; for x := 1 to AudioCount do begin Synchronize(@prgUpdate); audioTracks := audioTracks + intToStr(x); if x <> AudioCount then audioTracks := audioTracks + ','; end; if frmMain.chkHardSubs.Checked = true then begin frmMain.lstOut.Items.add('HandbrakeCLI -i ' + '"' + trim(frmMain.lstAdd.Items[frmMain.i]) + '" ' + ' -f mkv -o ' + '"' + trim(frmMain.lstAdd.Items[frmMain.i]) + '-OUT.mkv' + '" ' + venString + trim(frmMain.txtVideoValue.Text) + ' -e x264 -x ' + x264String + ' -E vorbis -B '+ trim(frmMain.txtAudioValue.Text) + ' -w ' + trim(frmMain.txtWidth.Text) + ' -l ' + trim(frmMain.txtHeight.Text) + ' -s 1 --subtitle-burn 1' + ' -a ' + audioTracks); end else if frmMain.chkHardSubs.Checked = false then begin frmMain.lstOut.Items.add('HandbrakeCLI -i ' + '"' + trim(frmMain.lstAdd.Items[frmMain.i]) + '" ' + ' -f mkv -o ' + '"' + trim(frmMain.lstAdd.Items[frmMain.i]) + '-OUT.mkv' + '" ' + venString + trim(frmMain.txtVideoValue.Text) + ' -e x264 -x ' + x264String + ' -E vorbis -B '+ trim(frmMain.txtAudioValue.Text) + ' -w ' + trim(frmMain.txtWidth.Text) + ' -l ' + trim(frmMain.txtHeight.Text) + ' -a ' + audioTracks); end; Synchronize(@prgUpdate); scanned := true; end; if (scanned = true) and (frmMain.i < frmMain.lstAdd.Items.Count) and (sPro.Running = false) then begin //i := i + 1; Synchronize(@iUpdate); scanned := false; Synchronize(@prgUpdate); end; if (scanned = false) and (frmMain.i = frmMain.lstAdd.Items.Count)then begin //frmMain.tmrScan.Enabled := false; Synchronize(@prgUpdate); ShowMessage('Scanning Done'); frmMain.btnEncode.Enabled := true; scanned := true; frmMain.prgScan.Position := frmMain.prgScan.Min; frmMain.lstAdd.Clear; frmMain.tbsOutput.Show; //sPro.Free; //M.Free; end;end;