|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Подвисание программы и пути решения
Строчу потихоньку курсач - антивирус. Вот написал сканирующий блок, пока он только собирает списки папок и файлов. Принцип такой:
Есть некая стартовая точка, от которой будет проводиться сканирорвание, например, диск D: или D:\projects, программа собирает список всех папок от этой точки в массив и затем для каждой из этих папок составляет список файлов и по каждому из файлов проводит сканирование. Но вот в чем проблема, пока идет сканирование, программа как бы подвисает, но не зависает, т.е. весь интерфейс подвисает, а по прогресс-барам понятно, что сканирование идет. Т.е. если мне вдруг нужно будет остановить сканирование, то я не смогу нажать кнопку, пока сканирование полностью не будет окончено, ибо форма в это время ни на что не реагирует. Возможно ли как-то обойти эту проблему? |
#2
|
||||
|
||||
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard |
#3
|
|||
|
|||
Используйте для сканирования отдельный поток, тогда форма не будет подвисать. Кстати, я бы не стал сначала получать список файлов, а потом еще раз по нему идти - проще по ходу получения файлов их проверять. тогда имена файлов не будут занимать лишней памяти, и вообще, работать будет быстрее. Ежели не секрет - какой алгоритм сканирования используете?
|
#4
|
|||
|
|||
Цитата:
Цитата:
В принципе я так и делаю - я храню в памяти только список файлов одной директории, потом память освобождаю. Потом записывается список для следующей директории и т.д. Алгоритм довольно прост: 1) Берем начальную точку 2) От этой точки берем список всех папок (в т.ч. и вложенных) 3) Далее в цикле прогоняем каждую папку - - Для папки получаем список файлов - - Прогоняем полученные файлы в цикле - - - Берем md5 хеш-сумму файла, ищем ее в базе - - - Если в базе найден такой хеш, файлик есть вирус - - Освобождаем память под файлы Конечно при таком подходе зараженный файлы не отловить, а только "чистые" вирусы. Но мне пока больше и не нужно Еще планирую по такому же плану сканировать процессы: - Сначала перейти к файлу, запустившего процесс и проверить его - затем получить список всех спроецированных в процесс библиотек и их отсканировать |
#5
|
|||
|
|||
В поток пока засунуть процедуру не получается, вылетает ошибка, хотя если сувать что-то простенькое, вроде ShowMessage, то по большому счету работает.
|
#6
|
||||
|
||||
Если обращаешься в VCL компонентам из потока, надо синхронизировать поток.
Конечно шансы маленькие, но если будет колизии, Ваш "антивирус" будет кричать зря ЗЫ http://habrahabr.ru/post/145454/ + Просто воспользуйтесь поиском по данному сайту, тут были примеры более "умных" антивирусов. Как минимум: http://www.delphisources.ru/pages/so...antivirus.html http://www.delphisources.ru/pages/so...us_module.html Помогаю за Спасибо |
#7
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#8
|
|||
|
|||
Разобрался немного с потоками. Засунул всю процедуру сканирования в отдельный поток, но особо это ничего не дало. По прежнему программа уходит в вис во время сканирования если не использовать Application.ProcessMessages, а с ним подвисает только во время взятия хеш-суммы файла, хотя сама функция взятия хеш суммы вызывается из процедуры, которая была положена в отдельный поток. Да, и почему-то я не вижу этот самый созданный поток в диспетчере, хотя поигравшись, можно предположить что он создается, раз процедуры выполняются. И еще, создаваемому потоку как-то ровно на приоритет, хоть tpIdle хоть tpTimeCritical, выполняется все одинаково.
|
#9
|
|||
|
|||
А вы запустив поток не ждите его завершения
|
#10
|
|||
|
|||
Создала поток через file-new-thread.., запихнул туда код сканера.
На кнопочку навесил код создания этого потока. Скачал ProcessThreadsView. Поток создается, но судя по поведению программы все идет через основной поток. Может ли влиять на это то, что из кода сканера вызываются процедуры и функции из других модулей? |
#11
|
||||
|
||||
Цитата:
в потоке можно даже вызывать IntToStr(0) из SysUtils Пишу программы за еду. __________________ |