Текущий архив: 2006.04.02;
Скачать: CL | DM;
ВнизМногозадачнасть + SerchFiles Найти похожие ветки
← →
Тормаз (2006-03-15 08:06) [0]где косяк немогу понять года ставлю 1 поток количество файов нормально когда много теряеться...
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const
D32 = $66;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
c1,c2,c3:Comp;
_nomThread,
kol:integer;
function SerchFiles(Path:string):Boolean;
{ Private declarations }
public
function RDTSC: comp;
{ Public declarations }
end;
type
TSearchThread = class(TThread)
private
_keyB: Boolean;
_path: String;
_kolThread: integer;
function SerchFiles(Path:string):Boolean;
protected
procedure Execute; override;
public
constructor Create(path:String; kolThread: integer);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor TSearchThread.Create(path:String; kolThread: integer);
begin
_path := path;
_kolThread := kolThread;
inherited Create(False);
end;
procedure TSearchThread.Execute;
begin
FreeOnTerminate := True;
_keyB:=True;
inc(Form1._nomThread);
SerchFiles(_path);
dec(Form1._nomThread);
if _keyB=false then
Form1.Memo1.Lines.Append("Err="+inttostr(Form1._nomThread));
if Form1._nomThread=0 then
begin
Form1.c2:=Form1.RDTSC;
Form1.c3:=Form1.c2-Form1.c1;
Form1.c1:=Form1.RDTSC;
sleep(1000);
Form1.c2:=Form1.RDTSC;
Form1.c2:=Form1.c2-Form1.c1;
Form1.Memo1.Lines.Append(IntToStr(Form1.kol)+" :"+Format("%8.6f", [Form1.c3/Form1.c2]));
end;
end;
function TSearchThread.SerchFiles(Path:string):Boolean;
var
SR: TSearchRec;
begin
_keyB:=False;
if FindFirst(Path+"\*.*", faAnyFile, SR) = 0 then
begin
Result := true;
repeat
sleep(0);
if (SR.Name<>".") and (SR.Name<>"..") then
if (SR.Attr and faDirectory)<>0 then
begin
if Form1._nomThread <_kolThread then
TSearchThread.Create(Path+"\"+SR.Name,_kolThread)
else
SerchFiles(Path+"\"+SR.Name);
end
else
begin
inc(Form1.kol);
end;
until FindNext(SR) <> 0;
end
else
begin
Result := False;
end;
_keyB:=True;
end;
function TForm1.RDTSC: comp;
var
TimeStamp: record
case byte of
1: (Whole: comp);
2: (Lo, Hi: LongInt);
end;
begin
asm
db $0F; db $31; // BASM doesn"t support RDTSC
{Pentium RDTSC - Read Time Stamp Counter - instruction}
{$ifdef Cpu386}
mov [TimeStamp.Lo],eax // the low dword
mov [TimeStamp.Hi],edx // the high dword
{$else}
db D32
mov word ptr TimeStamp.Lo,AX
{mov [TimeStamp.Lo],eax - the low dword}
db D32
mov word ptr TimeStamp.Hi,DX
{mov [TimeStamp.Hi],edx - the high dword}
{$endif}
end;
Result := TimeStamp.Whole;
end;
function TForm1.SerchFiles(Path:string):Boolean;
var
SR: TSearchRec;
begin
if FindFirst(Path+"\*.*", faAnyFile, SR) = 0 then
begin
Result := true;
repeat
sleep(0);
if (SR.Name<>".") and (SR.Name<>"..") then
if (SR.Attr and faDirectory)<>0 then
begin
SerchFiles(Path+"\"+SR.Name);
end
else
begin
inc(kol);
end;
until FindNext(SR) <> 0;
end
else
begin
Result := False;
// if FindFirst(Path+"\*.*", faAnyFile, SR) <> 53 then
// WriteLog(Path+" - "+SysErrorMessage(FindFirst(Path+"\*.*"+ " sKernel[6]", faAnyFile, SR)));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
kol:=0;
c1:=RDTSC;
SerchFiles("E:");
c2:=RDTSC;
c3:=c2-c1;
c1:=RDTSC;
sleep(1000);
c2:=RDTSC;
c2:=c2-c1;
Memo1.Lines.Append(IntToStr(kol)+" :"+Format("%8.6f", [c3/c2]));
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
_nomThread:=0;
kol:=0;
c1:=RDTSC;
TSearchThread.Create("E:",2);
end;
end.
← →
TUser © (2006-03-15 08:35) [1]
> Form1.c2:=Form1.RDTSC;
> Form1.c3:=Form1.c2-Form1.c1;
> Form1.c1:=Form1.RDTSC;
> sleep(1000);
> Form1.c2:=Form1.RDTSC;
> Form1.c2:=Form1.c2-Form1.c1;
Нехорошо так. См. метод Synchronize.
> где косяк немогу понять года ставлю 1 поток количество файов
> нормально когда много теряеться...
Как это по-человечески звучит?
← →
Тормаз (2006-03-15 08:40) [2]1) Чем нехорошо?
2)
TSearchThread.Create("E:",1); пременая.kol=(равна количеству файлов)
TSearchThread.Create("E:",10); пременая.kol=(почемуто она меньше)
← →
balepa © (2006-03-15 09:07) [3]
> 1) Чем нехорошо?
Synchronize + F1
← →
Тормаз (2006-03-15 09:18) [4]ну а ответ на второй пункт?(на главный вопрос)
← →
clickmaker © (2006-03-15 10:19) [5]
> Тормаз (15.03.06 09:18) [4]
он находится в первом.
Крутить глобальный счетчик из нескольких потоков лучше не через Inc, а InterlockedIncrement или Synchronize
Страницы: 1 вся ветка
Текущий архив: 2006.04.02;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.04 c