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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.06.2014, 17:05   #1
Karateka
Пользователь
 
Регистрация: 25.05.2013
Сообщений: 33
По умолчанию Антивирус, проблема с потоком

В общем доделываю Антивирус к своим лабам. Преподаватель попросил добавить возможность остановки поиска зараженных файлов.
В общем думал, думал. Решил использовать потоки. Создал отдельно проект, создаю поток, кидаю ему функцию поиска файлов. И все, сразу крошится. Объясните, в чем проблема? По форуму смотрел пару тем, честно, как-то не получилось вникнуть.

Вот код

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  TMyThread = class(TThread)
  procedure Find();
  private

  protected
    procedure Execute; override;
  end;
var
  Form1: TForm1;
  _DirPath : string;
  _MyThread : TMyThread;
implementation

{$R *.dfm}
procedure TMyThread.Execute;
begin
 Find();
end;

procedure TMyThread.Find();
const
  N = 1;
  ArrExt : array[1..N] of String = ('.EXE');
var
  StrExt : string;
  StrDir : String;
  SearchRec : TSearchRec;
  i : Integer;


begin
  StrDir := IncludeTrailingBackslash(_DirPath);
  //aLog.Add('Папка: ' + StrDir);
  if FindFirst(StrDir + '*.*', faAnyFile, SearchRec) = 0 then
    repeat
      StrExt := UpperCase( ExtractFileExt(SearchRec.Name) );
      if (SearchRec.Name = '.') or (SearchRec.Name = '..') then
        Continue;
      if (SearchRec.Attr and faDirectory) <> 0 then
        Find()
      else
        for i := 1 to N do begin
          if StrExt = ArrExt[i] then begin
           Form1.Memo1.Lines.add('Файл: ' + StrDir + SearchRec.Name);
            Break;
          end;
        end;
    until FindNext(SearchRec) <> 0;
  FindClose(SearchRec);

end;
procedure TForm1.Button1Click(Sender: TObject);
begin
   _DirPath := 'C:';
  _MyThread:=TMyThread.Create(true);
  _MyThread.FreeOnTerminate:=true;
  _MyThread.Priority:=tpLower;
  _MyThread.Resume;
end;

end
Karateka вне форума Ответить с цитированием
Старый 08.06.2014, 17:29   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
сразу крошится
Что прям так без текста ошибки как Феникс в пепел превращается?
Цитата:
Form1.Memo1.Lines.add
Эт конечно не смертельно, но рекомендуется это выполнять в синхронизации.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.06.2014, 17:33   #3
Karateka
Пользователь
 
Регистрация: 25.05.2013
Сообщений: 33
По умолчанию

Пару секунд, и сразу крошится.

Текст ошибки: Project Project1.exe raised exception class $00000FD with message 'stack overflow at 0x7c90e8ee'.
Karateka вне форума Ответить с цитированием
Старый 08.06.2014, 17:41   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А-а-а... Ну да )
Сразу не заметил - Find().
Ты рекурсивно проходишь по одному и тому-же каталогу.
Могу порекомендовать свой способ: http://www.programmersforum.ru/showthread.php?t=6639
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.06.2014, 22:52   #5
Karateka
Пользователь
 
Регистрация: 25.05.2013
Сообщений: 33
По умолчанию

Спасибо, действительно ошибка была в этом, прошляпил.
Вот еще хотел спросить. Можно как-нибудь прикрутить 'прогресс-бар' отображающий ход сканирования. Мол сколько осталось до конца.
Karateka вне форума Ответить с цитированием
Старый 09.06.2014, 00:13   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Врядли. Тебе заранее не известно сколько ты пройдешь файлов.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2014, 01:47   #7
FleXik
Форумчанин
 
Регистрация: 01.11.2012
Сообщений: 770
По умолчанию

Цитата:
Эт конечно не смертельно, но рекомендуется это выполнять в синхронизации.
не рекомендуется, это вообще обязательно т.к помню Label и ShowMessage когда не синхронизировал у себя то у меня Label автоматически менял размер шрифта сам по себе на форме а ShowMessage менял форму окна автоматически с маленького аж на весь экран))) поэтому в этих случаях синхронизация вообще обязательна

а так, я хз как ТС вообще этот антивирус писал если у него проблема с 1 потоком.
FleXik вне форума Ответить с цитированием
Старый 09.06.2014, 09:40   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
это вообще обязательно
Ну не совсем ) В некоторых случаях на это можно закрыть глаза, но лучше не надо. Просто тебе с лабелью так повезло наглядно.
Цитата:
как ТС вообще этот антивирус писал если у него проблема с 1 потоком.
Видимо так же как и Бабушкин. Это же лабы. Тут сильно разворачиваться не надо.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2014, 09:42   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от FleXik Посмотреть сообщение
а так, я хз как ТС вообще этот антивирус писал если у него проблема с 1 потоком.
Чья бы корова мычала. Без обид
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.06.2014, 10:26   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

первое, не:
Код:
procedure TMyThread.Execute;
begin
 Find();
end;
а
Код:
procedure TMyThread.Execute;
begin
 Synchronize(Find());
end;
И того: Нахрена тебе поток? Вся работа снова ушла в основной Синхронизация нужна для кратковременных сообщений с основным и всего-то. Поиск делай внутри execute, в синхронизации передавай результат, т.е. только вот этот код:
Код:
           Form1.Memo1.Lines.add('Файл: ' + StrDir + SearchRec.Name);
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с потоком Aleksandr Общие вопросы Delphi 1 28.03.2013 18:45
Проблема с потоком! vovken1997 Общие вопросы Delphi 2 12.04.2012 21:21
Проблема с потоком ZekaUa Общие вопросы Delphi 4 01.02.2012 15:29
Проблема с потоком timur oO Помощь студентам 2 14.04.2010 17:02