Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];

Вниз

Многозадачнасть + 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.053 c
9-1127387920
Signate
2005-09-22 15:18
2006.04.02
Ландшафт


15-1142060103
Карелин Артем
2006-03-11 09:55
2006.04.02
Рефакторинг проекта. Что посоветуете использовать?


3-1139565487
TrainerOfDolphins
2006-02-10 12:58
2006.04.02
Про координаты выделенной ячейки DBGrid а


2-1142414436
PoetOfDelphi
2006-03-15 12:20
2006.04.02
Проверка поля типа TNotifyEvent


2-1142679172
Std
2006-03-18 13:52
2006.04.02
HTTPS





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский