Главная страница
    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.051 c
15-1173046249
Суслик
2007-03-05 01:10
2007.04.22
Вот завел себе блог


15-1175178876
Ezorcist
2007-03-29 18:34
2007.04.22
PAS в блок схему?


15-1175194588
roamer
2007-03-29 22:56
2007.04.22
Delphi и 1С:Предприятие. Программирование информационного обмена


8-1154771305
Ильдар
2006-08-05 13:48
2007.04.22
Визуализация на BASS


15-1174897756
passlight
2007-03-26 12:29
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский