Как я могу передать данные от потока до родительского процесса?

Вам необходимо создать уведомление, чтобы его можно было обновить с помощью идентификатора уведомления, позвонив по телефону NotificationManager.notify(ID, notification).

Для обновления уведомления необходимо создать следующие шаги:

  1. Обновить или создать объект NotificationCompat.Builder
  2. Построить из него объект уведомления
  3. Выпустите Уведомление с тем же идентификатором, который вы использовали ранее

Пример, взятый из документации для разработчиков 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

1
задан Community 23 May 2017 в 09:57
поделиться

3 ответа

Почему бы не использовать простой FIFO (именованный канал)? Основной процесс будет автоматически блокироваться, пока не сможет что-то прочитать.
Если он не должен блокироваться, вместо этого должна быть возможность опроса, но, возможно, это будет сосать ЦП. Вероятно, для этой цели существует эффективная библиотека.

Я бы не рекомендовал использовать сигналы, потому что в них легко ошибиться. Если вы все равно хотите их использовать, я нашел самый простой способ:

  • Маскировать все сигналы в каждом потоке,
  • Специальный поток обрабатывает сигналы с помощью sigwait () . Возможно, ему придется разбудить другой поток, который будет обрабатывать сигнал, например, используя переменные условия.

Преимущество состоит в том, что вам больше не нужно беспокоиться о том, какую функцию безопасно вызывать из обработчика.

2
ответ дан 3 September 2019 в 01:28
поделиться

Я настоятельно рекомендую вам использовать потокобезопасную очередь, такую ​​как эта (статья и исходный код). Я лично использовал его, и он очень прост в использовании. API состоит из простых методов, таких как push (), try_pop (), wait_and_pop () и empty ().

Обратите внимание, что он основан на Boost.Thread .

0
ответ дан 3 September 2019 в 01:28
поделиться

" оптимальное решение во многом зависит от вашей конкретной установки. У вас есть один процесс с основным потоком и дочерним потоком или у вас есть один родительский процесс и дочерний процесс? Какую ОС и какую библиотеку потоков вы используете?

Причина последнего вопроса в том, что текущий стандарт C ++ 03 не имеет понятия «поток». В частности, это означает, что любое решение, предлагаемое вашей ОС и библиотекой потоков, зависит от платформы. Наиболее переносимые решения только скроют эти особенности от вас в своей реализации.

В частности, C ++ не имеет понятия потоков в своей модели памяти, а также не имеет понятия атомарных операций, синхронизации, упорядоченного доступа к памяти, условий гонки и т. д.

Однако велика вероятность, что какая бы библиотека вы ни использовали, она уже предоставляет решение вашей проблемы на вашей платформе.

В частности, это означает, что любое решение, предлагаемое вашей ОС и библиотекой потоков, зависит от платформы. Наиболее переносимые решения только скроют эти особенности от вас в своей реализации.

В частности, C ++ не имеет понятия потоков в своей модели памяти, а также не имеет понятия атомарных операций, синхронизации, упорядоченного доступа к памяти, условий гонки и т. д.

Однако велика вероятность, что какая бы библиотека вы ни использовали, она уже предоставляет решение вашей проблемы на вашей платформе.

В частности, это означает, что любое решение, предлагаемое вашей ОС и библиотекой потоков, зависит от платформы. Наиболее переносимые решения только скроют эти особенности от вас в своей реализации.

В частности, C ++ не имеет понятия потоков в своей модели памяти, а также не имеет понятия атомарных операций, синхронизации, упорядоченного доступа к памяти, условий гонки и т. д.

Однако велика вероятность, что какая бы библиотека вы ни использовали, она уже предоставляет решение вашей проблемы на вашей платформе.

0
ответ дан 3 September 2019 в 01:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: