Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Многозадачнасть + 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 поток количество файов
> нормально когда много теряеться...

Как это по-человечески звучит?


Наверх

Титульная страница Поиск, карта сайта Написать письмо