Вам необходимо создать уведомление, чтобы его можно было обновить с помощью идентификатора уведомления, позвонив по телефону NotificationManager.notify(ID, notification)
.
Для обновления уведомления необходимо создать следующие шаги:
NotificationCompat.Builder
Пример, взятый из документации для разработчиков Android:
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Sets an ID for the notification, so it can be updated
int notifyID = 1;
mNotifyBuilder = new NotificationCompat.Builder(this)
.setContentTitle("New Message")
.setContentText("You've received new messages.")
.setSmallIcon(R.drawable.ic_notify_status)
numMessages = 0;
// Start of a loop that processes data and then notifies the user
...
mNotifyBuilder.setContentText(currentText).setNumber(++numMessages);
// Because the ID remains unchanged, the existing notification is updated.
mNotificationManager.notify(notifyID, mNotifyBuilder.build());
...
Также см. Документы Android по уведомлениям о суммировании https://developer.android.com/training/wearables/notifications/stacks.html
Почему бы не использовать простой FIFO (именованный канал)? Основной процесс будет автоматически блокироваться, пока не сможет что-то прочитать.
Если он не должен блокироваться, вместо этого должна быть возможность опроса, но, возможно, это будет сосать ЦП. Вероятно, для этой цели существует эффективная библиотека.
Я бы не рекомендовал использовать сигналы, потому что в них легко ошибиться. Если вы все равно хотите их использовать, я нашел самый простой способ:
sigwait ()
. Возможно, ему придется разбудить другой поток, который будет обрабатывать сигнал, например, используя переменные условия. Преимущество состоит в том, что вам больше не нужно беспокоиться о том, какую функцию безопасно вызывать из обработчика.
Я настоятельно рекомендую вам использовать потокобезопасную очередь, такую как эта (статья и исходный код). Я лично использовал его, и он очень прост в использовании. API состоит из простых методов, таких как push (), try_pop (), wait_and_pop () и empty ().
Обратите внимание, что он основан на Boost.Thread .
" оптимальное решение во многом зависит от вашей конкретной установки. У вас есть один процесс с основным потоком и дочерним потоком или у вас есть один родительский процесс и дочерний процесс? Какую ОС и какую библиотеку потоков вы используете?
Причина последнего вопроса в том, что текущий стандарт C ++ 03 не имеет понятия «поток». В частности, это означает, что любое решение, предлагаемое вашей ОС и библиотекой потоков, зависит от платформы. Наиболее переносимые решения только скроют эти особенности от вас в своей реализации.
В частности, C ++ не имеет понятия потоков в своей модели памяти, а также не имеет понятия атомарных операций, синхронизации, упорядоченного доступа к памяти, условий гонки и т. д.
Однако велика вероятность, что какая бы библиотека вы ни использовали, она уже предоставляет решение вашей проблемы на вашей платформе.
В частности, это означает, что любое решение, предлагаемое вашей ОС и библиотекой потоков, зависит от платформы. Наиболее переносимые решения только скроют эти особенности от вас в своей реализации.В частности, C ++ не имеет понятия потоков в своей модели памяти, а также не имеет понятия атомарных операций, синхронизации, упорядоченного доступа к памяти, условий гонки и т. д.
Однако велика вероятность, что какая бы библиотека вы ни использовали, она уже предоставляет решение вашей проблемы на вашей платформе.
В частности, это означает, что любое решение, предлагаемое вашей ОС и библиотекой потоков, зависит от платформы. Наиболее переносимые решения только скроют эти особенности от вас в своей реализации.В частности, C ++ не имеет понятия потоков в своей модели памяти, а также не имеет понятия атомарных операций, синхронизации, упорядоченного доступа к памяти, условий гонки и т. д.
Однако велика вероятность, что какая бы библиотека вы ни использовали, она уже предоставляет решение вашей проблемы на вашей платформе.