|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
14.02.2013, 22:57 | #1 |
Новичок
Джуниор
Регистрация: 14.02.2013
Сообщений: 3
|
Thread и Queue: пересылка данных из потока в поток
Доброе время суток!
**************** Была задача по пересылке данных из одного потока в другой вот решил его через Queue, все работает, но только вот ресурсов отжирает очень много, целое ядро грузит программа. А вся проблема, на мой взгляд, это организация FIFO через Queue(далее очередь), видимо не предусмотрено ее использовать в таком режиме. Алгоритм:в первом потоке я в очередь постоянно записываю массив, а во втором постоянно считываю, но первый поток работает медленнее второго и поэтому второй поток иногда вычитывает все элементы из очереди и ждет новых в каждом цикле проверяя очередь, для того чтобы не обратиться к пустой очереди, я сделал две защиты это проверка: if (FifoBlock.Count != 0) или if (FifoBlock.Peek() != null) и try{ ... } catch{ ... } Так вот, проверка на количество элементов в очереди, очень ресурсозатратно работает. Буду рад совету по оптимизации данного кода или другому алгоритму Код:
|
15.02.2013, 07:06 | #2 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,886
|
Thread.Sleep() ?
|
15.02.2013, 10:08 | #3 |
Новичок
Джуниор
Регистрация: 14.02.2013
Сообщений: 3
|
Второй поток должен постоянно работать, он не сильно грузит систему,
проблема в передаче данных между потоками, если постоянно делать проверку типа Код:
самое простое решение при данном алгоритме, которое мне приходит в голову, это ввести в первом потоке переменную bool flag и во втором потоке смотреть, если данные пришли в первый поток flag=true, во втором потоке вычитал всю очередь, то flag=false, и мониторить уже flag, это менее болезненно, чем мониторить очередь, но мне это решение не очень нравится. |
15.02.2013, 11:50 | #4 | |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,886
|
Цитата:
Возможно , Вы что-то не так формулируете, ибо Вас сложно понять с такими логическими нестыковками Я и предлагаю приостанавливать второй поток, пусть проверка (точнее вообще работа потока) идёт непостоянно, а периодами. Код:
Ну и, не понятно, как код работал при неправильных скобках. Если проблема Ваша не решится, киньте весь проект архивом, подебажу малость. Последний раз редактировалось phomm; 15.02.2013 в 11:55. |
|
15.02.2013, 12:24 | #5 | |
Новичок
Джуниор
Регистрация: 14.02.2013
Сообщений: 3
|
Цитата:
Проблему решил только что, оказалось дело не в очереди, если как в моем случае запустить два потока и пустить их вообще без каких-либо тормозов, т.е. без Thread,Sleep(1), то система видимо отдает под программу ядро. Добавил задержек и программа на загрузки ядер практически никак не влияет Код:
Код:
|
|
16.02.2013, 13:27 | #6 |
Пользователь
Регистрация: 12.11.2008
Сообщений: 17
|
Все что тут написано - за такое я бы по рукам надавал)
Какие задержки, простите? Это же универская задача producer/consumer (поставщик/потребитель) про семафоры! Вот написал простенький пример: Код:
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поток (Thread) не хочет показывать панель (Panel). | bagabuga | Общие вопросы Delphi | 7 | 30.03.2012 14:57 |
спонтанная ошибка при синхронизации потока Thread и основного приложения(Посылка сообщений) | Человек_Борща | Общие вопросы Delphi | 2 | 14.05.2011 22:25 |
Thread. проблемы с работой потока. Моментально исчезают созданные в потоке формы. | Casper-SC | Общие вопросы .NET | 3 | 24.04.2010 12:28 |
Thread.Приложение не отвечает. Не запускается поток. | Zerofill | Общие вопросы Delphi | 2 | 10.10.2009 16:04 |