gtk и glib, самоуничтожающийся idle
ну чо, скептики в очередной раз посрамлены ;) вполне работоспособный способ. Сделал так:
1) структурка с флагом "менеджер FIFO включен" и мьютексом.
2) функция "обновить менеджер FIFO"
функция вызывается из потока, принимающего данные - собственно, ПОСЛЕ приёма очередной порции. Она смотрит на флаг "включен?" и если уже нет, то заново его включает. Сам же "менеджер FIFO" совершает ритуальное самоубийство, если очередь данных пуста. И сбрасывает флажок (собсно, поэтому мьютекс и нужен - флаг анализируется одним потоком, а меняет состояние в другом)
Таким образом, если данные есть - он работает, автоматически завершаясь после опустошения очереди. Если же данные приходят, пока он работает, то функционирование ничем не отличается от предыдущей версии. Байты приходят не так чтобы совсем уж часто и на графике загрузки ЦПУ я вообще не вижу пиков - колебания где-то около нуля, что мне и требовалось. Voila! Из всех лишних накладных расходов - тест логической переменной и, время от времени, добавление указателя на функцию в очередь. Ничего страшного.
(и никакой это не "обход системных механизмов", это как раз их бесхитростная эксплуатация).
P.S. нашёл интересную штуковину - GtkDatabox, надо освоить.
1) структурка с флагом "менеджер FIFO включен" и мьютексом.
2) функция "обновить менеджер FIFO"
функция вызывается из потока, принимающего данные - собственно, ПОСЛЕ приёма очередной порции. Она смотрит на флаг "включен?" и если уже нет, то заново его включает. Сам же "менеджер FIFO" совершает ритуальное самоубийство, если очередь данных пуста. И сбрасывает флажок (собсно, поэтому мьютекс и нужен - флаг анализируется одним потоком, а меняет состояние в другом)
Таким образом, если данные есть - он работает, автоматически завершаясь после опустошения очереди. Если же данные приходят, пока он работает, то функционирование ничем не отличается от предыдущей версии. Байты приходят не так чтобы совсем уж часто и на графике загрузки ЦПУ я вообще не вижу пиков - колебания где-то около нуля, что мне и требовалось. Voila! Из всех лишних накладных расходов - тест логической переменной и, время от времени, добавление указателя на функцию в очередь. Ничего страшного.
(и никакой это не "обход системных механизмов", это как раз их бесхитростная эксплуатация).
P.S. нашёл интересную штуковину - GtkDatabox, надо освоить.