![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| perceptron |
|
|||
|
Unregistered |
Короче говоря запускаю в обработчике OnClick моей кнопки несколько тредов :
TThread.Create(параметры); // создаём поток Каждый тред читает из нужного файла данные и вызывает нужную хранимую процедуру на MS SQL 2000 Server посредством ADO для занесения данных в базу. Мне нужно чтобы мои потоки выполнялись поочерёдно. Для этого я в моём TThread.Execute ставлю критическую секцию. Соответственно выполняться ДОЛЖЕН только 1 поток - остальные замирают. Затем первый выходит из секции и за ним следующий поток входит в неё. на форме есть также progressbar который показывает % занесения данных моими потоками в базу. Всё бы ничего НО - когда я начал делать тестовые прогоны программы, то ИНОГДА происходит так, что progressbar не доползает до финиша! Я чтобы проследить как ведут себя потоки в проге решил проверить очерёдность работы потоков и начал писать показания контрольных точек проги в файл. Вот что я увидел: Поток M12.txt создан Поток stuDos.stu создан Поток M19.TXT создан Поток M22.TXT создан Поток M35.TXT создан Поток M12.txt вошёл в критическую секцию !!!!!!!!! Поток stuDos.stu вошёл в критическую секцию !!!!!!!!! Поток M12.txt покинул критическую секцию Поток M12.txt вызвал ThreadsDone Поток M12.txt разрушен Поток M19.TXT вошёл в критическую секцию Поток stuDos.stu покинул критическую секцию Поток stuDos.stu вызвал ThreadsDone Поток stuDos.stu разрушен Поток M22.TXT вошёл в критическую секцию Поток M19.TXT покинул критическую секцию Поток M19.TXT вызвал ThreadsDone Поток M19.TXT разрушен Поток M35.TXT вошёл в критическую секцию Поток M22.TXT покинул критическую секцию Поток M22.TXT вызвал ThreadsDone Поток M22.TXT разрушен Поток M35.TXT !!! - не до конца дописывается строка в trace-файл то есть поток зависает и планировщик передаёт управление дальше VCL-потоку - главной форме. Должна идти строка Поток M35.TXT покинул критическую секцию но этого не происходит. Поток M35.TXT блокируется навсегда и соответственно progressbar не доходит до финиша. Отсюда вопрос - ПОЧЕМУ не работает Критическая Секция Но иногда бывает всё по человечески - потоки отрабатывают как надо, а иногда происходит вот такая лажа. Мой TMaketThread.Execute выглядит так: FreeOnTerminate := True; OnTerminate := frmMain.ThreadsDone; EnterCriticalSection(CS); try читаем данные из файла и отправляем их на вход ХП finally LeaveCriticalSection(CS); И в frmMain.ThreadsDone если выполняется последний поток то делаю DeleteCriticalSection(CS); Подскажите в чём тут может быть проблема? |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 14 Всего: 48 |
может попробовать InitializeCriticalSection?
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |