Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.22;
Скачать: CL | DM;

Вниз

Как лучше сделать межпотоковое взаимодействие: есть несколько   Найти похожие ветки 

 
EgorovAlex ©   (2007-02-24 17:56) [0]

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


 
Игорь Шевченко ©   (2007-02-24 20:13) [1]

Пул потоков использовать ?


 
EgorovAlex ©   (2007-02-24 20:27) [2]

А где про это применительно к Дельфи почитать? Всё, что я нагуглил касается Net :(


 
Игорь Шевченко ©   (2007-02-25 00:45) [3]


> А где про это применительно к Дельфи почитать?


Применительно к Delphi не знаю, где. А применительно к Win32, и, следовательно, к Delphi тоже, можно почитать у Рихтера и Кларка в "Программировании серверных приложений для Windows 2000".


 
Сергей М. ©   (2007-02-27 08:25) [4]


> EgorovAlex ©   (24.02.07 17:56)


> как лучше и правильнее создать этот поток


TMyThread.Create(параметры)


> и вызывать


Поток не вызывают, его создают (см. выше)


> Тут должно быть что-то типа очереди


Логично.
Смотри класс TQueue, он под организацию очереди как раз и "заточен".
Только не забывай про синхронизацию доступа к очереди со стороны нескольких потоков одновременно. См. TCriticalSection.


 
GrayFace ©   (2007-02-27 10:22) [5]

Сергей М. ©   (27.02.07 8:25) [4]
Смотри класс TQueue, он под организацию очереди как раз и "заточен".

Только он кривой - при каждом добавлении перемещает все, что в нем находится. Если очередь может быть большой и важна скорость, лучше сделать связный список блоков памяти по PageSize каждый. При чтении от входа в крит. секцию можно будет отказаться, при особом желании можно сократить использование CriticalSection при записи.


 
Сергей М. ©   (2007-02-27 13:30) [6]


> GrayFace ©   (27.02.07 10:22) [5]


> он кривой - при каждом добавлении перемещает все, что в
> нем находится.


Он не "кривой", он просто базируется на готовой функциональности TList.Insert


 
GrayFace ©   (2007-02-27 16:07) [7]

Да, не кривой, а неоптимальный, т.к. глюков в нем нет.


 
Сергей М. ©   (2007-02-27 16:37) [8]


> EgorovAlex


Очередь сообщений тоже подойдет. Даже еще проще в реализации.
см. Post[Thread]Message (для стороны, ставящей нечто в хвост очереди) и Peek/Wait/GetMessage (для стороны, выбирающей это нечто из головы очереди)


 
Tor ©   (2007-02-28 11:36) [9]

Можеш реализовать очередь через TThreadList потокобезопасный список указателей. А указывать на какойто обект или структуру которая и будет харектиризовать событие.
К примеру реализовать два метода входа в этот список(с блокировкой), после чего работаешь с любым обектом. Допустим поток считывает данные из очереди и удаляет. И второй метод выхода из списка дабы другие потоки могли иметь доступ к списку. Т.е. на подобии критических секций, и какой нибудь простой очереди. Причем потоки должны считывать и удалять из очереди событие до окончания выполнения, а иначе нет смысла в потоках.

Или же можно использовать пул-потоков, т.е. не очередь событий а очередь потоков которые ждут прихода событий(сообщений) в замороженом состоянии.
Передаеш данные потоку, и размараживаеш. Возможно в это будет более эфективнее чем предыдущее. Если свободных потоков нет создаеш. На подобии TCP соединения с использованием Инди.

В общем методов столько на сколько позволяет фантазия, но это уже философия :)



Страницы: 1 вся ветка

Текущий архив: 2007.04.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.067 c
15-1175006565
oldman
2007-03-27 18:42
2007.04.22
Почему мы так поступили?


2-1175667350
Steep
2007-04-04 10:15
2007.04.22
Скроллер на панели


1-1172141459
Gin2
2007-02-22 13:50
2007.04.22
GetPropValue для IInterface


2-1175682244
Officeman
2007-04-04 14:24
2007.04.22
Цветные делений в ProgressBar1


15-1174885995
Тульский
2007-03-26 09:13
2007.04.22
Экспорт из MS SQL в PostgreSQL