Форум: "Основная";
Текущий архив: 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