Форум по 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 в.д.
Ответить с цитированием
  #8  
Старый 09.06.2012, 12:51
PRStudio PRStudio вне форума
Прохожий
 
Регистрация: 18.02.2012
Сообщения: 13
Репутация: 143
По умолчанию

Разобрался немного с потоками. Засунул всю процедуру сканирования в отдельный поток, но особо это ничего не дало. По прежнему программа уходит в вис во время сканирования если не использовать Application.ProcessMessages, а с ним подвисает только во время взятия хеш-суммы файла, хотя сама функция взятия хеш суммы вызывается из процедуры, которая была положена в отдельный поток. Да, и почему-то я не вижу этот самый созданный поток в диспетчере, хотя поигравшись, можно предположить что он создается, раз процедуры выполняются. И еще, создаваемому потоку как-то ровно на приоритет, хоть tpIdle хоть tpTimeCritical, выполняется все одинаково.
Ответить с цитированием
  #9  
Старый 09.06.2012, 13:40
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

А вы запустив поток не ждите его завершения
Ответить с цитированием
  #10  
Старый 11.06.2012, 17:41
PRStudio PRStudio вне форума
Прохожий
 
Регистрация: 18.02.2012
Сообщения: 13
Репутация: 143
По умолчанию

Создала поток через file-new-thread.., запихнул туда код сканера.
На кнопочку навесил код создания этого потока.
Скачал ProcessThreadsView. Поток создается, но судя по поведению программы все идет через основной поток.

Может ли влиять на это то, что из кода сканера вызываются процедуры и функции из других модулей?
Ответить с цитированием
  #11  
Старый 13.06.2012, 09:49
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от PRStudio
Может ли влиять на это то, что из кода сканера вызываются процедуры и функции из других модулей?
нет.
в потоке можно даже вызывать IntToStr(0) из SysUtils
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter