Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.02.2009, 14:56
VALERO VALERO вне форума
Прохожий
 
Регистрация: 26.02.2009
Сообщения: 4
Репутация: 10
По умолчанию Запуск потоков в цикле

Есть цикл, в котором нужно запускать два паралельных одинаковых потока (с разными параметрами). После их реализации нужно вернуться в главную програму. Потом цикл повторяется.

Как сделать так, чтобы поток не создавать и удалять каждый раз в цыкле? Тоесть, чтобы объявить его перед цыклом один раз и удалить после него... Пробывал с ф-цией waitfor, но она ожидает пока поток закончится и я не знаю, как запустить поток потом обратно(только через Create, который со временем без уничтожения Destroy выдает нехватку памяти)... Тоесть мне нужно либо ф-ция типа waitfor, которая ждет то остановки потока(suspend), или как можно запускать повторно поток. Это все связанно с тем, чтобы увеличить быстродействие, а при каждом создании и уничтажении в цикле программа работает даже дольше чем без потоков...

Огромная просьба помочь с этой проблемой побыстрее. Спасибо.
Ответить с цитированием
  #2  
Старый 26.02.2009, 15:44
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,018
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

На вскидку:
1. Передать в поток некоторый callback, который будет вызван по завершению работы потока (не по завершению самого потока).
2. Внутри потока его не завершать, а просто делать ожидание задания работы. После того, как поток все выполнит, он вызывает переданный callback и переходит в режим ожидания (т.е. пустой цикл).
Ответить с цитированием
  #3  
Старый 26.02.2009, 15:52
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Есть свойство FreeOnTerminate ставь его в истину, поток будет освобождаться по окончании работы самостоятельно.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #4  
Старый 26.02.2009, 15:56
VALERO VALERO вне форума
Прохожий
 
Регистрация: 26.02.2009
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Aristarh Dark
Есть свойство FreeOnTerminate ставь его в истину, поток будет освобождаться по окончании работы самостоятельно.

В таком случае не будет работать ф-ция waitfor. Хотя если знаешь как без нее обойтись, скажи...

Цитата:
Сообщение от lmikle
На вскидку:
1. Передать в поток некоторый callback, который будет вызван по завершению работы потока (не по завершению самого потока).
2. Внутри потока его не завершать, а просто делать ожидание задания работы. После того, как поток все выполнит, он вызывает переданный callback и переходит в режим ожидания (т.е. пустой цикл).

Нужно попробывать... А не будет ли поток, который преостановлен, загружать ядро процессора, в то время, когда после него будет запущен другой поток под это ядро? И еще... как сделать, чтобы основная программа ждала остановки потока? Если вызывать какойто колбек, то нужно както проверять в программе, что поток остановлен... Я пока знаю только два способа : через waitfor, который ожидает именно заверщения потока и через цикл, в котором проверяется остановлен ли поток или нет (но это помоему занимает много ресурсов)...

Последний раз редактировалось VALERO, 26.02.2009 в 16:00.
Ответить с цитированием
  #5  
Старый 26.02.2009, 16:02
VALERO VALERO вне форума
Прохожий
 
Регистрация: 26.02.2009
Сообщения: 4
Репутация: 10
По умолчанию

Ну вот таким образом через некоторое время выскакивает недостаточно памяти

Код:
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  
Старый 26.02.2009, 17:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,018
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А циклы с проверкой флага тебя не устраивают.
Фактически, waitfor это цикл, проверяющий наличие хэндла потока (если правильно помню). А тебе надотпросто проверять какой-либо флаг, выставляемый калбэком.
Ответить с цитированием
  #7  
Старый 26.02.2009, 20:03
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от VALERO
В таком случае не будет работать ф-ция waitfor. Хотя если знаешь как без нее обойтись, скажи...
а почему не будет???? в справке же английским по белому написано:
Цитата:
Call WaitFor to obtain the value of ReturnValue when the thread finishes executing. WaitFor doesn't return until the thread terminates, so the thread must exit either by finishing the Execute method or by exiting when the Terminated property is true.

и в догонку: а если ты все равно ждешь окончания работы нити (потока) - то зачем тебе отдельная нить?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #8  
Старый 26.02.2009, 20:21
VALERO VALERO вне форума
Прохожий
 
Регистрация: 26.02.2009
Сообщения: 4
Репутация: 10
По умолчанию

Мне нужно ускорить работу, поэтому я части програмы запускаю в потоки... Мне тут посоветовали восспользоваться PostMessage и в потоке сделать бесконеччный цыкл, сейчас буду пробывать
Ответить с цитированием
  #9  
Старый 26.02.2009, 22:26
Аватар для Karsh
Karsh Karsh вне форума
Активный
 
Регистрация: 22.09.2007
Адрес: SPb
Сообщения: 228
Версия Delphi: 7, 2009, XE2
Репутация: 70
По умолчанию

Цитата:
Сообщение от Aristarh Dark
и в догонку: а если ты все равно ждешь окончания работы нити (потока) - то зачем тебе отдельная нить?
согласен. нет смысла создавать поток и ждать его завершения в цикле, да и это никак не ускорит работу программы, а наоборот замедлит.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:52.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter