Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.045 c
6-1162118715
0x00
2006-10-29 13:45
2007.04.22
ICS v5; ICS v6


15-1175115313
ProgRAMmer Dimonych
2007-03-29 00:55
2007.04.22
Ма-а-а-аленький вопрос по HTML


1-1172328976
EgorovAlex
2007-02-24 17:56
2007.04.22
Как лучше сделать межпотоковое взаимодействие: есть несколько


15-1174760272
oxffff
2007-03-24 21:17
2007.04.22
Саундтреки в программе "Максимум" на НТВ. Подскажите


15-1174896516
Нулевой
2007-03-26 12:08
2007.04.22
Кто такой?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский