|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Запуск потоков в цикле
Есть цикл, в котором нужно запускать два паралельных одинаковых потока (с разными параметрами). После их реализации нужно вернуться в главную програму. Потом цикл повторяется.
Как сделать так, чтобы поток не создавать и удалять каждый раз в цыкле? Тоесть, чтобы объявить его перед цыклом один раз и удалить после него... Пробывал с ф-цией waitfor, но она ожидает пока поток закончится и я не знаю, как запустить поток потом обратно(только через Create, который со временем без уничтожения Destroy выдает нехватку памяти)... Тоесть мне нужно либо ф-ция типа waitfor, которая ждет то остановки потока(suspend), или как можно запускать повторно поток. Это все связанно с тем, чтобы увеличить быстродействие, а при каждом создании и уничтажении в цикле программа работает даже дольше чем без потоков... Огромная просьба помочь с этой проблемой побыстрее. Спасибо. |
#2
|
|||
|
|||
На вскидку:
1. Передать в поток некоторый callback, который будет вызван по завершению работы потока (не по завершению самого потока). 2. Внутри потока его не завершать, а просто делать ожидание задания работы. После того, как поток все выполнит, он вызывает переданный callback и переходит в режим ожидания (т.е. пустой цикл). |
#3
|
||||
|
||||
Есть свойство FreeOnTerminate ставь его в истину, поток будет освобождаться по окончании работы самостоятельно.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#4
|
|||
|
|||
Цитата:
В таком случае не будет работать ф-ция waitfor. Хотя если знаешь как без нее обойтись, скажи... Цитата:
Нужно попробывать... А не будет ли поток, который преостановлен, загружать ядро процессора, в то время, когда после него будет запущен другой поток под это ядро? И еще... как сделать, чтобы основная программа ждала остановки потока? Если вызывать какойто колбек, то нужно както проверять в программе, что поток остановлен... Я пока знаю только два способа : через waitfor, который ожидает именно заверщения потока и через цикл, в котором проверяется остановлен ли поток или нет (но это помоему занимает много ресурсов)... Последний раз редактировалось VALERO, 26.02.2009 в 16:00. |
#5
|
|||
|
|||
Ну вот таким образом через некоторое время выскакивает недостаточно памяти
Код:
T1:=TT1.Create(true); //создание 1 потока T1.FreeOnTerminate:=false; T1.Priority:=TpNormal; T2:=TT1.Create(true); //создание 2 потока T2.FreeOnTerminate:=false; T2.Priority:=TpNormal; цикл начинается T1.Resume; T2.Resume; s:=T1.WaitFor; s:=T2.WaitFor; T1:=TT1.Create(true); T2:=TT1.Create(true); lmikle: последнее китайское предупреждение. Надо тегами пользоваться... ...какоето действие цикл заканчивается А если после waitfor удалить их(Free), то не выдает... Это еще связанно с тем, что я указал FreeOnTerminate:=false; - это для того, чтобы работала ф-ция waitfor.... |
#6
|
|||
|
|||
А циклы с проверкой флага тебя не устраивают.
Фактически, waitfor это цикл, проверяющий наличие хэндла потока (если правильно помню). А тебе надотпросто проверять какой-либо флаг, выставляемый калбэком. |
#7
|
||||
|
||||
Цитата:
Цитата:
и в догонку: а если ты все равно ждешь окончания работы нити (потока) - то зачем тебе отдельная нить? Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#8
|
|||
|
|||
Мне нужно ускорить работу, поэтому я части програмы запускаю в потоки... Мне тут посоветовали восспользоваться PostMessage и в потоке сделать бесконеччный цыкл, сейчас буду пробывать
|
#9
|
||||
|
||||
Цитата:
|