mahdy.asia
یک شنبه 11 مرداد 1394, 14:28 عصر
من کد زیر را می خواهم در یک thread بنویسم، کد بدون خطا اجرا می شود اما هنگام اجرا کار دیگری نمی شود انجام داد و انگاری کد بدون thread اجرا شده است.
procedure SplitFile(FileName : TFileName; FilesByteSize : Integer) ;
// FileName == file to split into several smaller files
// FilesByteSize == the size of files in bytes
var
fs, ss: TFileStream;
cnt : integer;
SplitName: String;
begin
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) ;
try
for cnt := 1 to Trunc(fs.Size / FilesByteSize) + 1 do
begin
SplitName := ChangeFileExt(FileName, Format('%s%d', ['._',cnt])) ;
ss := TFileStream.Create(SplitName, fmCreate or fmShareExclusive) ;
try
if fs.Size - fs.Position < FilesByteSize then
FilesByteSize := fs.Size - fs.Position;
ss.CopyFrom(fs, FilesByteSize) ;
finally
ss.Free;
end;
end;
finally
fs.Free;
end;
end;
**********************************
کد thread
**********************************
type
TMyThread = class(TThread)
private
FileName : TFileName; FilesByteSize : Integer
{ Private declarations }
public
constructor Create(FileName : TFileName; FilesByteSize : Integer);
procedure SplitFile ;
protected
procedure Execute; override;
published
property OnTerminate;
end;
procedure TMyThread.SplitFile ;
// FileName == file to split into several smaller files
// FilesByteSize == the size of files in bytes
var
fs, ss: TFileStream;
cnt : integer;
SplitName: String;
begin
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) ;
try
for cnt := 1 to Trunc(fs.Size / FilesByteSize) + 1 do
begin
SplitName := ChangeFileExt(FileName, Format('%s%d', ['._',cnt])) ;
ss := TFileStream.Create(SplitName, fmCreate or fmShareExclusive) ;
try
if fs.Size - fs.Position < FilesByteSize then
FilesByteSize := fs.Size - fs.Position;
ss.CopyFrom(fs, FilesByteSize) ;
finally
ss.Free;
end;
end;
finally
fs.Free;
end;
end;
constructor TMyThread.Create(FileName : TFileName; FilesByteSize : Integer);
begin
inherited Create(True);
FileName := trdFileName ;
FilesByteSize := 512000;
end;
procedure TMyThread.Execute;
begin
inherited;
Synchronize(SplitFile);
Terminate;
end;
procedure SplitFile(FileName : TFileName; FilesByteSize : Integer) ;
// FileName == file to split into several smaller files
// FilesByteSize == the size of files in bytes
var
fs, ss: TFileStream;
cnt : integer;
SplitName: String;
begin
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) ;
try
for cnt := 1 to Trunc(fs.Size / FilesByteSize) + 1 do
begin
SplitName := ChangeFileExt(FileName, Format('%s%d', ['._',cnt])) ;
ss := TFileStream.Create(SplitName, fmCreate or fmShareExclusive) ;
try
if fs.Size - fs.Position < FilesByteSize then
FilesByteSize := fs.Size - fs.Position;
ss.CopyFrom(fs, FilesByteSize) ;
finally
ss.Free;
end;
end;
finally
fs.Free;
end;
end;
**********************************
کد thread
**********************************
type
TMyThread = class(TThread)
private
FileName : TFileName; FilesByteSize : Integer
{ Private declarations }
public
constructor Create(FileName : TFileName; FilesByteSize : Integer);
procedure SplitFile ;
protected
procedure Execute; override;
published
property OnTerminate;
end;
procedure TMyThread.SplitFile ;
// FileName == file to split into several smaller files
// FilesByteSize == the size of files in bytes
var
fs, ss: TFileStream;
cnt : integer;
SplitName: String;
begin
fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) ;
try
for cnt := 1 to Trunc(fs.Size / FilesByteSize) + 1 do
begin
SplitName := ChangeFileExt(FileName, Format('%s%d', ['._',cnt])) ;
ss := TFileStream.Create(SplitName, fmCreate or fmShareExclusive) ;
try
if fs.Size - fs.Position < FilesByteSize then
FilesByteSize := fs.Size - fs.Position;
ss.CopyFrom(fs, FilesByteSize) ;
finally
ss.Free;
end;
end;
finally
fs.Free;
end;
end;
constructor TMyThread.Create(FileName : TFileName; FilesByteSize : Integer);
begin
inherited Create(True);
FileName := trdFileName ;
FilesByteSize := 512000;
end;
procedure TMyThread.Execute;
begin
inherited;
Synchronize(SplitFile);
Terminate;
end;