Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2012, 22:50   #1
HSR
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 26
Восклицание Не дать накапливаться N кол-ву потоков в критической секции. Массив.

Доброго времени суток.
Ввожу в курс дела.

Есть код. В нем создан класс потока, в самом потоке происходят GET запросы(последовательно) и получают некую информацию, каждый новый поток запускается по таймеру, каждую секунду(например), и чтобы действия в потоке успевали выполняться полностью, не пересекаясь, я добавил критическую секцию, чтобы они вставали в очередь.

Если поставить таймер поменьше, то потоки начинают накапливаться!

Как не дать накапливаться N кол-ву потоков в критической секции?

Мне умный человек сказал - Это одномерный массив "thread:array [1..n] of longint;" - мне вот нужно ограничиться 5 потоками в очереди - thread:array [1..5] of longint;
Типо укажи размер массива.

Что-то я не понял как это реализовать?
HSR вне форума Ответить с цитированием
Старый 14.11.2012, 22:56   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Тебе нужна не критическая секция а семафор.
или если мыслить более масштабно - сущность под названием "пул потоков"
про первое можно почитать у Рихтера, про второе - у гоогле.
Rififi вне форума Ответить с цитированием
Старый 14.11.2012, 23:23   #3
HSR
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Rififi Посмотреть сообщение
Тебе нужна не критическая секция а семафор.
или если мыслить более масштабно - сущность под названием "пул потоков"
про первое можно почитать у Рихтера, про второе - у гоогле.
Суть еще в том, что окно программы не должно тормозить при GET запросах, пробовал WaitFor - неподошло...
Вот мои куски из кода. Напишите плиз в исправленном виде.

Код:
//добавил новый класс
type
 TNewThread = class(TThread)
  Private

  Public
    Procedure Execute; override;
    constructor Create(CreateSuspended: boolean);
  end;

//Объявил переменную крит. секции
var
  StopItSynch:TCriticalSection;

//Создал крит.секцию
procedure TForm1.FormCreate(Sender: TObject);
begin
StopItSynch:=TCriticalSection.Create;
end;

constructor TNewThread.Create(CreateSuspended: boolean);
begin
inherited Create(CreateSuspended);
end;

//по таймеру вызываю поток
procedure TForm1.Timer1Timer(Sender: TObject);
var
 NewThread: TNewThread;
begin
 NewThread:=TNewThread.Create(false);
 NewThread.FreeOnTerminate:=True;
 NewThread.Priority:=tpLower;
 NewThread.Resume;
end;

//тело потока
procedure TNewThread.Execute;
var i:integer;
begin
StopItSynch.Enter; //Блокирует прочие потоки, когда вызывающий поток заходит в критическую секцию

for i:=0 to 1 do
  begin 
(всякие GET-запросы)
  end;
StopItSynch.Leave; //Позволяет другим потокам использовать критическую секцию.
При такой раскладке, программа НЕ ТОРМОЗИТ, но накапливаются потоки, и через час или два оперативки нехватит...(( И цель выполнять в процедуре Execute без метода Synchronize(процедура) - из-за него окно тормозит тоже...
HSR вне форума Ответить с цитированием
Старый 14.11.2012, 23:38   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Стесняюсь спросить, а почему по таймеру?
Что за задача? Потоки для чего нужны?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.11.2012, 00:22   #5
HSR
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Стесняюсь спросить, а почему по таймеру?
Что за задача? Потоки для чего нужны?
Предположим, что нужно парсить погоду с сайта.
С потоками нашел только такой выход.
HSR вне форума Ответить с цитированием
Старый 15.11.2012, 00:32   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Та ради бога, зачем в таймере кучу потоков создавать?
Создай один поток и порядок. Зачем несколько потоков для парсинга?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.11.2012, 00:36   #7
HSR
Пользователь
 
Регистрация: 10.12.2011
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Та ради бога, зачем в таймере кучу потоков создавать?
Создай один поток и порядок. Зачем несколько потоков для парсинга?
Тупанул наверное, просто нужно было сделать задержку(управляемую),
потом понял что можно в поток засунуть Sleep.
HSR вне форума Ответить с цитированием
Старый 15.11.2012, 01:02   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну да. Чтоб проц не грузило, не можно а нужно
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачи на обработку строк: удалить каждую 3-ю букву, найти кол-во гласных, кол-во цифр в строке,совпадения в 2-х строках Ирина93 Паскаль, Turbo Pascal, PascalABC.NET 6 05.11.2011 22:10
Добавить в массив требуемое кол-во элементов, потом создать в ComboBox Casper-SC Общие вопросы .NET 3 24.02.2010 20:05
двумерный динамический массив с запросом к пользователю о кол-ве строк и столбцов? vasyapupkin Общие вопросы C/C++ 2 22.11.2009 17:37
Найти кол-во целых чисел в первой последовательности и кол-во нечетных во второй. DjDeniels-61 Помощь студентам 7 28.06.2009 13:04
кол. массив alexov Общие вопросы C/C++ 3 03.02.2009 16:56