| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Проблема с многопоточностью |
| Автор: CynicRus 29.8.2013, 09:10 | ||||||||
| Приветсвую уважаемых форумчан. Задача - организовать скачивание и фильтрацию данных. Использую Win 7 и Delphi XE3 Для этого было заведены кустарных очереди и глобальная крит секция типа TRTLCriticalSection. Схематичный код очереди:
Критическая секция инициализируется в initialization разделе юнита. Очереди создаются там же. Затем я запускаю первый тред, который выглядит:
В одиночестве он нормально отрабатывает, вопросов к нему никаких. Кидает в эту кустарную очередь полученые итемы. После первого треда я запускаю второй тред вида:
Где SearchingQueue совсем другая очередь, к которой никто не обращается кроме потока 2. Так вот, по отдельности треды очень даже хорошо работают, а вот вместе - нет. Я подозреваю что проблема в функции GetPage с использованием synapse, которая выглядит:
но, критические секции в данной функции проблему не решают, да и по идее - разве не в каждом потоке используется не свой экземпляр функции? Вообщем каким образом мне заставить подобную конструкцию работать? PS: попробовал завести функцию скачивания каждую, как метод класса моего потока - не помогло. Бьётся память и все тут. Переход на Indy и заведения своего экземпляра IdHTTP в каждом потоке проблему не решил, всё так же кидает exception на строку 1908 файла GetMem.inc которая выглядит как mov [eax - 4], edx. И функция зовётся SysGetMem. |
| Автор: CynicRus 29.8.2013, 10:44 |
| Сделал в очередях критические секции локальными, вызов второго потока сделал из первого, и закомментировал добавление в searchingQueue - падать перестало...Но почему падает то? Нельзя наследоваться от Generic'ов чтоли? |
| Автор: Illusion Dolphin 29.8.2013, 10:50 | ||||||||
Не виже синхронизации этой функции (надеюсь внутри она thread-safe?)
Count не thread-safe
Этого не надо
Посмотрите Call-Stack! |
| Автор: CynicRus 29.8.2013, 11:07 | ||||||||||
FWriteLn - да, она ThreadSafe, внутри её вызов заключен в критические секции. Разбираюсь дальше, спасибо за наводку. Обрамление вызова в крит секции Count так же не помогло-( Ну а стек выглядит вот так: ![]() |
| Автор: Illusion Dolphin 29.8.2013, 11:14 | ||
Верните как было, дождитесь падения и посмотрите всё-таки на Call-Stack |
| Автор: CynicRus 29.8.2013, 11:15 |
| Ну вот я смотрю, и падает она в процессе работы при добавлении итема в очередь. Толи критические секции не отрабатывают, толи ещё что...Не пойму. А вот стек падения с GetMem.ini ![]() |
| Автор: Illusion Dolphin 29.8.2013, 11:28 |
| Вот перейдите на ThreadParser.TUrlWorker.ProcessUrl в колстеке и дважды кликните посмотрите на какой строке падает. Добавлено через 1 минуту и 27 секунд Вы пользоваться колстеком умеете? |
| Автор: CynicRus 29.8.2013, 11:33 | ||
Огромное спасибо! Два дня сношался, но до такой простой вещи не додумался:) Оказалось что падает функция очистки строки от html тэгов-)))) |