Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2010, 19:31   #1
lnikon
 
Регистрация: 22.07.2010
Сообщений: 6
По умолчанию Поисковик по маске. Использование потоков в среде(tthread) Delphi.

Народ, помогите, задание написать поисковик по маске, настройки из ини читаются. написал там кое что решил поток сделать, вот запарка вышла, не получается убить поток при нажатии на кнопку, сделал типа паузу, пробовал TPoisk.Terminate говорит this form of method call only allowed for class methods, и еще, запускаю поток, выполняется процедура файндфалз и после выполнения уходит в слип, выполняется пока не прервем ее, если не нажимать стоп, то увеличивается память занимаемая программой, как сделать освобождение по окончании выполнения процедуры?


вот код:

Код:
unit skaner;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls, FileCtrl, Grids, Outline, DirOutln, IniFiles,
  ShellApi, Menus, ExtCtrls, ComCtrls;

type
  TMainForm = class(TForm)
    lbFiles: TListBox;
    StatusBar1: TStatusBar;
    Timer1: TTimer;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
  public
    kon,poi,maska,inter,glub,dl:string;
    p,dlina:integer;
    stop:boolean;
   end;

var
  MainForm: TMainForm;

implementation

uses FPoisk, Vizov;

var myini:TIniFile; Stop:Boolean = False;
{$R *.DFM}

procedure TMainForm.N2Click(Sender: TObject);
begin
close;
end;

procedure TMainForm.Timer1Timer(Sender: TObject);
begin
StatusBar1.Panels[0].Text:=FormatDateTime('dd.mm.yyyy hh.nn.ss',now);
end;

procedure TMainForm.FormCreate(Sender: TObject);
var IniPath:string;
x:integer; s,q:string;
begin
Timer1Timer(Self);
StatusBar1.Panels[1].Text:='Отключен';
stop:=false;
perem1:=false;
{MainForm.lbFiles.Items.LoadFromFile('log.log');}
GetDir(0,IniPath);
myini:=TIniFile.Create(IniPath+'\options.ini');
poi:=myini.ReadString('default','nazn','netu puti');
maska:=myini.ReadString('default','maska','maska ne ukazana');
kon:=myini.ReadString('default','kon','netu puti');
inter:=myini.ReadString('default','inter','net intervala');
p:=strtoint(inter);
glub:=myini.ReadString('default','glub','ne ukazana glubina');
dl:=myini.ReadString('default','dlin','ne ukazana dlina loga');
dlina:=strtoint(dl);
myini.Free;
end;


procedure TMainForm.N3Click(Sender: TObject);
var Poisk:TPoisk;
LogFile:textfile;
Vizov:TVizov;
begin
AssignFile(LogFile,'log.log');
if FileExists('log.log') then
Append(LogFile) else
Rewrite(LogFile);
Writeln(LogFile,DateTimeToStr(Now)+': монитор запущен');
CloseFile(LogFile);
stop:=false;
  N3.Enabled := False;
  N4.Enabled := True;
  StatusBar1.Panels[1].Text:='Работает';
  Screen.Cursor := crHourGlass;
  try
    lbFiles.Items.Add(timetostr(time)+': монитор запущен');
    Poisk:=TPoisk.Create(false);
    finally
    Screen.Cursor := crDefault;
  end;
end;


procedure TMainForm.N4Click(Sender: TObject);
var Poisk:TPoisk;
LogFile:textfile;
begin
AssignFile(LogFile,'log.log');
if FileExists('log.log') then
Append(LogFile) else
Rewrite(LogFile);
Writeln(LogFile,DateTimeToStr(Now)+': монитор остановлен');
CloseFile(LogFile);
stop := true;
lbFiles.Items.Add(timetostr(time)+': монитор остановлен');
StatusBar1.Panels[1].Text:='Отключен';
 N3.Enabled := True;
 N4.Enabled := False;
 stop:=true;
end;

end.

Последний раз редактировалось rpy3uH; 22.07.2010 в 21:45.
lnikon вне форума Ответить с цитированием
Старый 22.07.2010, 19:31   #2
lnikon
 
Регистрация: 22.07.2010
Сообщений: 6
По умолчанию

Второй юнит (поток):



Код:
unit FPoisk;

interface

uses
  Classes, ShellApi, SysUtils, IniFiles, Windows, Messages, Variants, Controls,
  StdCtrls;

type
  TPoisk = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure FindFiles(APath:string);
    function GetDirectoryName(Dir: string): string;
    procedure Update;
    procedure logException(f:string; g:string);
    public

     constructor Create(Suspend:Boolean);
     Destructor Destroy; override;
  end;

implementation

uses skaner;
constructor TPoisk.Create(Suspend:Boolean);
  begin
    inherited Create(Suspend);
  end;

  destructor TPoisk.Destroy;
  begin
 
  end;

  var
  FSearchRec, DSearchRec: TSearchRec;
  FindResult: integer;
  APath,f:string;
  FFileName: string;

function TPoisk.GetDirectoryName(Dir: string): string;
begin
  if Dir[Length(Dir)] <> '\' then
    Result := Dir + '\'
  else
    Result := Dir;
end;

function WindowsCopyFile(FromFile, ToDir : string) : boolean;
var F: TShFileOpStruct;
begin
  F.Wnd:=0;
  F.wFunc:=FO_MOVE;
  FromFile:=FromFile+#0;
  F.pFrom:=pchar(FromFile);
  ToDir:=ToDir+#0;
  F.pTo:=pchar(ToDir);
  F.fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION;
  result:=ShFileOperation(F) = 0;
end;

procedure TPoisk.FindFiles(APath:string);
  function IsDirNotation(ADirName: string): Boolean;
  begin
    Result := (ADirName = '.') or (ADirName = '..');
  end;
begin
while MainForm.stop=false do
begin
FFileName:=MainForm.maska;
  APath := GetDirectoryName(APath);
  {APath:=APath+'\';}
  FindResult := FindFirst(APath + FFileName, faAnyFile + faHidden +
    faSysFile + faReadOnly, FSearchRec);
    begin
  try
      while FindResult = 0 do
    begin
      f:=APath+FSearchRec.Name;
      Synchronize(Update);
      FindResult := FindNext(FSearchRec);
      end;
    FindResult := FindFirst(APath + '*.*', faDirectory, DSearchRec);
    while FindResult = 0 do
    begin
      if ((DSearchRec.Attr and faDirectory) = faDirectory) and not
        IsDirNotation(DSearchRec.Name) then
        FindFiles(APath + DSearchRec.Name);
      FindResult := FindNext(DSearchRec);
    end;
  finally
    SysUtils.FindClose(FSearchRec);
    end;
    end;
    end;
    sleep(MainForm.p);
end;

procedure TPoisk.logException(f:string; g:string);
var LogFile:textfile;
begin
AssignFile(LogFile,'log.log');
if FileExists('log.log') then
Append(LogFile) else
Rewrite(LogFile);
Writeln(LogFile,DateTimeToStr(Now)+': файл '+f+' перемещен в '+g);
CloseFile(LogFile);
end;

procedure TPoisk.Update;
var x:integer; q,s,a,w,e:string;
begin
if MainForm.lbFiles.Items.Count>5 then
MainForm.lbFiles.Items.Delete(0);
MainForm.lbFiles.ItemIndex:=MainForm.lbFiles.Items.Count-1;
s:=FSearchRec.Name;
x:=strtoint(MainForm.glub);
case x of
1: begin q:=s[5]+s[6]; createdir(MainForm.kon+'\'+q); e:=(MainForm.kon+'\'+q); end;
2: 
 begin 
  q:=s[5]+s[6]; createdir(MainForm.kon+'\'+q);  
  a:=s[3]+s[4]; createdir(MainForm.kon+'\'+q+'\'+a); 
  e:=(MainForm.kon+'\'+q+'\'+a); 
 end;
3: begin 
   q:=s[5]+s[6]; 
   createdir(MainForm.kon+'\'+q); 
   a:=s[3]+s[4]; 
  createdir(MainForm.kon+'\'+q+'\'+a); 
  w:=s[1]+s[2]; 
  createdir(MainForm.kon+'\'+q+'\'+a+'\'+w); 
  e:=(MainForm.kon+'\'+q+'\'+a+'\'+w); 
end;
end;
MainForm.lbFiles.Items.Add(LowerCase(FSearchRec.Name));  //APath+
WindowsCopyFile(f, e);
logException(FSearchRec.Name, e);
end;

procedure TPoisk.Execute;
begin
FreeOnTerminate:=true;
while not Terminated do
{Synchronize( procedure
      begin}
      FindFiles(MainForm.poi);
 {end);}
end;

end.

Последний раз редактировалось rpy3uH; 22.07.2010 в 21:47.
lnikon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приложение к среде Delphi - закладки bilov Софт 1 15.02.2010 07:32
Вычисление функций в среде Delphi Vetal07 Помощь студентам 7 01.11.2009 09:28
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18
использование TThread amandra Общие вопросы Delphi 6 03.05.2008 03:13
Использование потоков Repz Общие вопросы Delphi 6 25.01.2008 14:20