|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
05.03.2009, 17:26 | #1 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Некорректная работа потока
Здравствуйте. Такая проблема. Пишу многопоточное приложение, которое состоит из 3-х потоков: 1-й собственное сам процесс (программа), второй - поток операций интерфеса (удаление из списка, очистка списка файлов, обновлени файлов в списке и т.д.), а третий отвечает за выполнение 1-ой из 4-х операций: шифрование, дешифрование файлов, разбиение, сборка файлов.
Собственно проблема в том, что при работе 3-й поток в конце своей работы ведет себя непредсказуемым образом - может корректно завершиться (если число файлов в списке мало), передав управление интерфейсу, может выдать ошибку типа "не могу записать адрес0х00000000. Он не может быть рид" или что хуже всего, вылетает вся программа с ошибкой RunTime Error. Код потока FDLK.pas: Код:
"ковыряю изнутри" (с)
|
05.03.2009, 19:08 | #2 |
Форумчанин
Регистрация: 31.05.2007
Сообщений: 486
|
При возникновении исключения выполняется код
Код:
По-моему, можно и не заморачиваться с постоянным пересозданием массива initfiles, а просто заранее создать его с размером sl_filelist.Count и освободить объекты уже после цикла. |
06.03.2009, 06:33 | #3 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Jeni, дело в том, что при возникновении исключения объект уничтожать не надо, т.к. он (файловый поток) не может быть открыт для чтения, в чем собсно и проявляется исключение. А проявиться оно может в выделенной строчке:
Код:
ЗЫ. А может быть сначала проверять на занятость каждый файл в списке sl_filelist, и если не занят, то добавлять его в список sl_oplist. А затем в цикле создать динамический массив и заполнить его файловыми потоками?
"ковыряю изнутри" (с)
Последний раз редактировалось 3D Hunter; 06.03.2009 в 06:44. |
06.03.2009, 07:24 | #4 | |
Форумчанин
Регистрация: 31.05.2007
Сообщений: 486
|
Цитата:
Это не помешает делать в любом случае. Ведь исключения - не панацея. Если есть возможность выполнить проверку и предотвратить возникновение ошибки - значит, так и надо делать, а не доводить "до греха". |
|
06.03.2009, 09:20 | #5 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Не помогло. Правда теперь поток не вылетает. Он зависает на высвобождении файлов.
Тут пределанный вариант метода Execute: Код:
Код:
"ковыряю изнутри" (с)
|
09.03.2009, 08:25 | #6 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Народ, а че так хило? Никто не ответит? Слишком сложный вопрос?
"ковыряю изнутри" (с)
|
09.03.2009, 09:21 | #7 |
Android Developer
Старожил Подтвердите свой е-майл
Регистрация: 19.02.2007
Сообщений: 3,708
|
Куча кода, не ясно толком в чем проблема, я лично еще из первого поста догадываюсь, но разгребать код - тут уж извените.
p.s. Если есть общие объекты, используемые как в потоке так и в главном потоке (а не в процессе), то надо или их синхронизировать через метод TThread или создать критическую цекцию, и при использовании общих объектов заходить в критическую секцию, потом разумеется когда поработали с ними, выходить. |
09.03.2009, 10:51 | #8 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
Ладно. Код я перепишу полностью. Надо будет продумать архитектуру синхронизации с интерфейсом. Скажите, когда вызывается метод Synchronize, то поток передает управление главному процессу на выполнение и ждет его завершения или продолжает выполняться параллельно?
ВОВАН13, скажите, о чем вы догадываетесь из 1-го поста? Поделитесь мыслями, может мне поможет?
"ковыряю изнутри" (с)
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Уничтожение потока | SNUPY | Общие вопросы Delphi | 2 | 11.02.2009 22:47 |
Некорректная печать | Natalie | Microsoft Office Word | 5 | 29.08.2008 11:08 |
BDE и DataBase Desktop - некорректная работа в Vista | Dux | БД в Delphi | 9 | 03.04.2008 23:18 |