Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Многозадачность в программе


Автор: maximjon 1.6.2006, 05:10
Я пишу компонент, с начало  внего задаються необходимые параметры, затем запускаю процедуру выполнения, в ней создаёться поток, который будет контролировать ещё три потока, которыесоздаються уже в первом потоке. Контрольпроизводиться следующим образом:
Есть два буффера, массивы байтов с выделением памяти, основной поток (далее контроллер) проверяет статус массивов, если они пусты или пуст хоят бы один, то запускается поток чтения данных. Он должен считать данные в первый буффер, и если к концу чтения данных для первого буффера второй особождаеться, то считывает и для него. Затем контроллер запускает обработчик данных(также поток). Учтите что это происходит сразу после считывания данных в первый буффер.
После обработки данных происходит запуск записи данных  из буфферов которые уже обработанны.

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

А просьба такова, мне надо найти способ реализации многозадочной непрерывной обработки данных, с постоянной подгрузкой их в буффера. 

Автор: Mechanic 1.6.2006, 09:28
Цитата(maximjon @  1.6.2006,  05:10 Найти цитируемый пост)
Синхронизация не поможет, потому что все они пихаються в один основной поток и глючат страшно

Поможет.
Создай одну общую для приложения TCriticalSection, и передавай её в каждый из создаваемых потоков.
Тогда каждый поток при попытке доступа к общим данным пускай делает enter, а потом Leave.
 

Автор: maximjon 1.6.2006, 19:06
Если я правильно понял необходимо все элементы к которым будет обращаться какой-либо поток, необходимо запихать в элемент класса TCriticalSection. А что дальше делать что-то я не въехал! smile  В справке Дельфи нет примера, чтобы его разобрать а голова на перевод что-то не хочет работать.
Если не трудно дай примерчик для разбора, плизззз. 

Автор: Mechanic 1.6.2006, 22:26
В глобальном месте каком - нить создаешь переменную, и инитишь её:
Код

uses SyncObjs;
var CS: TCriticalSection;

initialization
   CS := TCriticalSection.Create;
finalization
   CS.Free;
end.

Потом в потоки её передаешь:
Код

Trd1 := TMyTrd.Create(true);
Trd1.CS := CS;
Trd1.Resume;

Потом в самом потоке юзаешь
Код

procedure TMyTrd.Execute; override;
begin
     шо попало
     //тут понадобилось обратиться к чему-нить глобальному
    CS.Enter;
    Шо-нитьГлобальное.Читать/Писать();
    CS.Leave;
    //Тут Шо-нитьГлобальное уже свободно, и другие потоки могут его отъюзать..
    ОпятьШоПопало;
end;
 

А вообще, чего эт я.. Есть же рульная книга из серии Must Have!  smile 

http://forum.vingrad.ru/index.php?showtopic=60076 

Автор: maximjon 4.6.2006, 19:26
БОЛЬШОЕ СПАСИБО!!!!! Прочитал, что-то вроде понял smile . 
Есть правда пару вопросов.
Предположим я создаю КритикалСекшион типа "КС" иничу её, но из документации я понял очень важную вещь, что владеть объектом может только один поток а уменя их 4!!! и что мне делать? Ась?!
У меня два буффера, три потока обработки данных и один управляющий поток, и основной VCL поток проги. Работа такова:
Контроллер: проверка статуса буферов, запуск потока чтения данных(если есть пустые буффера) или обработка буфферов или запись данных.
Дело ещё в том, что потоки работают одновременно...
Может производиться чтения второго буффера, в этот момент идёт обработка первого буффера, ну и конечно идёт процесс контролля всех этих процессов.
Есть мысль, можно ли создать несколько КритикалСекшион?
  

Автор: Mechanic 4.6.2006, 21:25
Цитата(maximjon @  4.6.2006,  19:26 Найти цитируемый пост)
Прочитал, что-то вроде понял 

Всю осилил? Фигасе! Молодец.  smile 

Конечно же, чтоб потоки, что хотят обратиться к одному буферу, не должны ждать, пока другие потоки поработают с абсолютно "отфонарным" другим буфером..  smile 
Конечно же, имеет смысл создание отдельных CriticalSection для каждого объекта, что требует отдельной синхронизации.
А можно ещё посмотреть в сторону TThreadList. Во многих случаях может оказаться полезным.

 

Автор: Демо 5.6.2006, 13:22
Цитата(Mechanic @  1.6.2006,  22:26 Найти цитируемый пост)
А вообще, чего эт я.. Есть же рульная книга из серии Must Have!


Есть еще книга. В ней как раз описан(и реализован полностью) нужный автору алгоритм.

http://oreon.com.ru/2006/03/27/fundamentalnye_algoritmy_i_struktury_dannykh_v_Delphi_baknell.html

Глава 12. Дополнительные темы.

Добавлено @ 13:24 
40Мб на Рапидшаре. 

Автор: maximjon 6.6.2006, 19:08
Демо, Судя по сему у тебя хорошое подключению к нету, 40 мегов smile  мне не осилить быстро!
Для меня это огромный размер, у меня скорость соеденения всего 33,6 кила smile , так что облом. 

Автор: Демо 6.6.2006, 19:36
maximjon, 
Если удастся, вытащу нужную тебе главу. 

Автор: maximjon 4.7.2006, 05:05
Демо, Уже прошло до фига времени, и где твоя глава? smile Мне она всё ещё очень нужна! 

Автор: Yanis 4.7.2006, 08:03
Цитата(maximjon @  6.6.2006,  20:08 Найти цитируемый пост)
Демо, Судя по сему у тебя хорошое подключению к нету, 40 мегов   мне не осилить быстро!
Для меня это огромный размер, у меня скорость соеденения всего 33,6 кила  , так что облом.  

Глава занимает 50 страниц. Выдирать их из pdf очень затруднительно. Може лучше обратиться к друзьям или в клуб сходить скачать эту книгу!? Она тебе намного больше пользы принесёт в цельном варианте, нежели в виде одной главы.

P. S. Навреное Демо забыл про главу из книги smile Все мы люди. 

Автор: maximjon 5.7.2006, 19:08
Yanis, есил бы ты знал в какой ж... я сижу. Тут и клубы с обрезанной скоростью!!! 

Автор: Alexeis 5.7.2006, 19:11
maximjon, существует специальная библиотека - называется Gala - как раз и предназначена для контроля и синхронизации многих потоков. Если надо - выложу! 

вот и ссылочка
http://alexei-s1.narod.ru/GALA.zip 

Автор: maximjon 5.7.2006, 19:26
alexeis1, THANKS!!!!  

Автор: Демо 6.7.2006, 17:31
maximjon, 
Могу выслать эту тему в PDF по почте ~6Мб. 

Автор: maximjon 10.7.2006, 18:36
Чуть позже, плиз у меня перегруз на мыле!
На днях разгребу и сообщу далее... Спасибо! 

Автор: maximjon 10.7.2006, 19:11
Уже разгрёб! Можешь присылать, на maximjon@yandex.ru 

Автор: Демо 10.7.2006, 23:50
Выслал 

Автор: maximjon 11.7.2006, 19:18
Что-то нету у меня письмеца!  smile  


M
Girder
Для таких дискусий есть РМ!
PS: Тема закрыта!
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)