![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Межпотоковое взаимодействие: есть поток, который при
AlexEgorov © (2007-04-24 09:41:00)поступленнии данных создаёт другой поток для их обработки и продолжает ждать новые данные. Как из второго потока вернуть обработанные данные в первый поток в сервисе? Если работа идёт в приложении, то Sinchronyze - и никаких проблем, а в сервисе это не прокатывает, наверное из-за того, что нет главной формы, в контексе которой работает код в Sinchronyze. Что можно сделать в сервисе?
AlexEgorov (2007-04-24 10:17:00) [21]> Это как ?
Начинает сильно тормозить - рассматривается ситуация, когда принтеров в системе более 50-ти и задания печати поступают довольно часто
Сергей М. (2007-04-24 10:15:00) [22]
> спулер входит в ступор
Это как ?
AlexEgorov (2007-04-24 10:13:00) [23]А в каком из потоков? Мне же как-раз множественное чтение для нескольких обрабатывающих потоков ненужно, т.к. спулер вешается.
MBo (2007-04-24 10:11:00) [24]может, воспользоваться TMultiReadExclusiveWriteSynchronizer?
AlexEgorov (2007-04-24 10:08:00) [25]Я хотел сначала на каждый станспортный делать обрабатывающий, но в этом случае спулер входит в ступор :( - я мониторю входящие задания печати, и транспортные потоки, это потоки мониторинга принтеров. А обрабатывающий поток выдёргивает и парсит эти задания.
Сергей М. (2007-04-24 10:04:00) [26]
> AlexEgorov (24.04.07 09:58) [3]
Я так понял, что у тебя один обрабатывающий поток на несколько транспортных ?
Странная, однако, затея - "семеро с ложкой, один с сошкой")
Reindeer Moss Eater (2007-04-24 10:02:00) [27]так вот похоже в какой-то момент эта сейция не освобождается и всё останавливается, т.к. все новые потоки обработки данных ждут освобождения секции, которая залочена :(
Наверное у тебя есть ошибка в программе
AlexEgorov (2007-04-24 09:58:00) [28]Сейчас у меня сделано так - после обработки данных второй поток перебирает список потоков поступающих данных (на самом деле их несколько), и устанавливает в нём Event, предварительно положив обработанные данные в некий буфер, как и предложил MBo.
Всё работает прекрасно, я не смог выловить каких-либо багов, но у клиента этот механизм дал сбой:
в потоке обработки данных есть критическая секция, чтобы стазу несколько потоков не положили систему, так вот похоже в какой-то момент эта сейция не освобождается и всё останавливается, т.к. все новые потоки обработки данных ждут освобождения секции, которая залочена :(
Сергей М. (2007-04-24 09:49:00) [29]Mожно также воспользоваться PostThreadMessage, если взаимодействие с раб.столом по каким-то причинам нежелательно. Иначе - SendMessage
MBo (2007-04-24 09:46:00) [30]второй поток кладет данные в некий буфер и выставляет объект синхронизации, например, Event, а первый поток, дождавшись срабатывания, забирает данные