Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: WinAPI и системное программирование > Помогите с потоками |
Автор: 1988Олег1988 27.7.2013, 18:04 | ||||
Доброго времени суток. Начал изучать работу с потоками и чем больше изучаю, тем больше вопросов Для работы с потоком создаю 2 массива потоков в сумме их 4 штуки всего (3 потока TrLTR27 и of TrLTR51)
Не подскажите почему у меня начинает виснуть прога когда я отправляю главному потоку сообщения из 2х разных и получается, что если убрать PostMessage(Form1.Handle, WM_PROCESSDATA51, NomerSlota,1 ); или второй зависание прекращается. Прошу подсказать почему появляется зависание и как от этого можно избавиться И второй вопрос, как можно ПРАВИЛЬНО приостанавливать и запускать поток? У меня в потока используется бесконечный циклы
В итоге когда я пытаюсь приостановить поток ArTrLTR27[i].Terminate;, останавливается все хорошо но пытаюсь запустить поток с помощью ArTrLTR27[i].Resume, но цикл не запускается. |
Автор: Illusion Dolphin 27.7.2013, 23:10 | ||||
= Suspend Terminate это значит дать знать потоку что он должен быть завершён.
Когда зависнет - посмотрите на вкладку потоки (Threads = Ctrl+Alt+T), там будет указано кто кого ждёт и почему. Двойным кликом переключайтесь между потоками и будите видеть Call-stack для каждго отдельного потока. |
Автор: StranikS 28.7.2013, 11:39 |
Глянул на главный код, непонятно зачем синхронизация идет через посты? Что это вам дает? Вы все равно обращаетесь к форме Form1 из каждого модуля с описанием потока. |
Автор: Illusion Dolphin 28.7.2013, 12:26 | ||
Например, это не блокирует поток, дожидаять обработки сообщения, как это через Send. |
Автор: 1988Олег1988 28.7.2013, 14:38 | ||||
Ну Посты я использовал для того чтобы не блокировать поток, дожидаясь обработки сообщения. А то что к форме на прямую обращаюсь - это временно. Вообще я лпанирую любые данные получаемые с потоков заполнять в некоторый глобальный список например типа SyncList:TList с доступом через крит.секцию. В таком случае главный поток сможет контролировать размер списка и либо забирать его целиком на обработку, либо ждать поступления дополнительных данных. Но пока руки не дошли и кое где ликбеза не хватает ![]() А может кто подскажет как можно в потоке дожидаться выполнения какой либо функции или процедуры в потоке??? например функция в потоке:
Но поток не дожидается ее выполнения и молотит дальше... |
Автор: Illusion Dolphin 28.7.2013, 15:23 | ||
Предполагаю ( ![]() ![]() |
Автор: 1988Олег1988 28.7.2013, 15:42 | ||
Решил проблему - просто с переменными запутался ![]() |