![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Многозадачнасть + SerchFiles
Тормаз © (2006-03-15 08:06:00)где косяк немогу понять года ставлю 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.
clickmaker (2006-03-15 10:19:00) [1]
> Тормаз (15.03.06 09:18) [4]
он находится в первом.
Крутить глобальный счетчик из нескольких потоков лучше не через Inc, а InterlockedIncrement или Synchronize
Тормаз (2006-03-15 09:18:00) [2]ну а ответ на второй пункт?(на главный вопрос)
balepa (2006-03-15 09:07:00) [3]
> 1) Чем нехорошо?
Synchronize + F1
Тормаз (2006-03-15 08:40:00) [4]1) Чем нехорошо?
2)
TSearchThread.Create('E:',1); пременая.kol=(равна количеству файлов)
TSearchThread.Create('E:',10); пременая.kol=(почемуто она меньше)
TUser (2006-03-15 08:35:00) [5]
> 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 поток количество файов
> нормально когда много теряеться...
Как это по-человечески звучит?