| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Критическая секция |
| Автор: perceptron 6.1.2004, 23:32 |
| Короче говоря запускаю в обработчике 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 8.1.2004, 00:53 |
| может попробовать InitializeCriticalSection? |