Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.06.2012, 00:26
PRStudio PRStudio вне форума
Прохожий
 
Регистрация: 18.02.2012
Сообщения: 13
Репутация: 143
По умолчанию Подвисание программы и пути решения

Строчу потихоньку курсач - антивирус. Вот написал сканирующий блок, пока он только собирает списки папок и файлов. Принцип такой:

Есть некая стартовая точка, от которой будет проводиться сканирорвание, например, диск D: или D:\projects, программа собирает список всех папок от этой точки в массив и затем для каждой из этих папок составляет список файлов и по каждому из файлов проводит сканирование.

Но вот в чем проблема, пока идет сканирование, программа как бы подвисает, но не зависает, т.е. весь интерфейс подвисает, а по прогресс-барам понятно, что сканирование идет. Т.е. если мне вдруг нужно будет остановить сканирование, то я не смогу нажать кнопку, пока сканирование полностью не будет окончено, ибо форма в это время ни на что не реагирует. Возможно ли как-то обойти эту проблему?
Ответить с цитированием
  #2  
Старый 09.06.2012, 00:51
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Application.ProcessMessages
потоки
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
  #3  
Старый 09.06.2012, 00:53
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Используйте для сканирования отдельный поток, тогда форма не будет подвисать. Кстати, я бы не стал сначала получать список файлов, а потом еще раз по нему идти - проще по ходу получения файлов их проверять. тогда имена файлов не будут занимать лишней памяти, и вообще, работать будет быстрее. Ежели не секрет - какой алгоритм сканирования используете?
Ответить с цитированием
  #4  
Старый 09.06.2012, 01:19
PRStudio PRStudio вне форума
Прохожий
 
Регистрация: 18.02.2012
Сообщения: 13
Репутация: 143
По умолчанию

Цитата:
Application.ProcessMessages
потоки
Спасибо, первый способ решил проблему, сейчас опробую и второй через создание потока.

Цитата:
Используйте для сканирования отдельный поток, тогда форма не будет подвисать. Кстати, я бы не стал сначала получать список файлов, а потом еще раз по нему идти - проще по ходу получения файлов их проверять. тогда имена файлов не будут занимать лишней памяти, и вообще, работать будет быстрее. Ежели не секрет - какой алгоритм сканирования используете?

В принципе я так и делаю - я храню в памяти только список файлов одной директории, потом память освобождаю. Потом записывается список для следующей директории и т.д.

Алгоритм довольно прост:

1) Берем начальную точку
2) От этой точки берем список всех папок (в т.ч. и вложенных)
3) Далее в цикле прогоняем каждую папку
- - Для папки получаем список файлов
- - Прогоняем полученные файлы в цикле
- - - Берем md5 хеш-сумму файла, ищем ее в базе
- - - Если в базе найден такой хеш, файлик есть вирус
- - Освобождаем память под файлы

Конечно при таком подходе зараженный файлы не отловить, а только "чистые" вирусы. Но мне пока больше и не нужно

Еще планирую по такому же плану сканировать процессы:
- Сначала перейти к файлу, запустившего процесс и проверить его
- затем получить список всех спроецированных в процесс библиотек и их отсканировать
Ответить с цитированием
  #5  
Старый 09.06.2012, 01:50
PRStudio PRStudio вне форума
Прохожий
 
Регистрация: 18.02.2012
Сообщения: 13
Репутация: 143
По умолчанию

В поток пока засунуть процедуру не получается, вылетает ошибка, хотя если сувать что-то простенькое, вроде ShowMessage, то по большому счету работает.
Ответить с цитированием
  #6  
Старый 09.06.2012, 02:23
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Если обращаешься в VCL компонентам из потока, надо синхронизировать поток.
Конечно шансы маленькие, но если будет колизии, Ваш "антивирус" будет кричать зря
ЗЫ http://habrahabr.ru/post/145454/
+ Просто воспользуйтесь поиском по данному сайту, тут были примеры более "умных" антивирусов.
Как минимум: http://www.delphisources.ru/pages/so...antivirus.html
http://www.delphisources.ru/pages/so...us_module.html
__________________
Помогаю за Спасибо
Ответить с цитированием
  #7  
Старый 09.06.2012, 02:50
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от v1s2222
Автор посчитал, что погорячился с исходным кодом. Архив удалён.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:17.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025