Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.05 c
2-1142873793
mrAndersen
2006-03-20 19:56
2006.04.02
Активизация после нажатия на ENTER


2-1142417409
wsm-100
2006-03-15 13:10
2006.04.02
ISAPI Ошибка при подключении к БД.


15-1141827843
Новичоккк
2006-03-08 17:24
2006.04.02
Можно как-нибудь это скачать?


2-1142499600
atmospheric
2006-03-16 12:00
2006.04.02
наследование класса


1-1141295597
Николай2006
2006-03-02 13:33
2006.04.02
использование TChart для рисования многоугольника