#c #multithreading #c 11 #visual-c
#c #многопоточность #c 11 #visual-c
Вопрос:
В моем приложении, когда я получаю оповещение о событии, которое я хотел отобразить, в пользовательском интерфейсе мигает «красный» цвет, и через какую-то долю секунды (например, 5 секунд) он должен вернуться в предыдущее состояние (например, зеленый).
Для достижения этой цели я планирую использовать поток в конструкторе, и как только я получил уведомление о предупреждении, я выполняю блокировку уведомления и запускаю поток. Из потока, вызывающего функцию DisplayColorOnUI(), чтобы установить цвет и заблокировать его на 5 секунд.
Я новичок в концепции потоковой передачи и пробую ее, как показано ниже. Это не рабочий код, но попробуйте сделать это вот так. Может ли кто-нибудь помочь мне со своими мыслями и вводными данными, чтобы продолжить эту логику.
ForeCastController.h std::thread m_Notificationthread; std::mutex m_mutexAlertNotification; std::condition_variable m_CondVarNotifyPending; std::mutex m_mutexDisplayColor; bool m_bIsAlertReceived = false; bool m_bIsThreadExiting = false; ForeCastController.cpp CForeCastController::CForeCastController() { m_Notificationthread = thread(amp;CForeCastController::IMNotificationThread, this); } void CForeCastController::IMNotificationThread() { while (true) { { std::unique_locklt;std::mutexgt; notifyLock(m_mutexAlertNotification); m_CondVarNotifyPending.wait(notifyLock, [this] { return m_bIsThreadExiting || m_bIsAlertReceived; }); m_bIsAlertReceived = false; if (m_bIsThreadExiting) { notifyLock.unlock(); break; } notifyLock.unlock(); } std::this_thread::sleep_for(std::chrono::seconds(5)); { const std::lock_guardlt;std::mutexgt; displayColorOnUIlock(m_mutexDisplayColor); DisplayColorOnUI(); } } } void CForeCastController::SetAlertNotificationStatus() { m_bIsAlertNotification = true; std::unique_locklt;std::mutexgt; notifyLock(m_mutexAlertNotification); m_bIsAlertReceived = true; notifyLock.unlock(); m_CondVarNotifyPending.notify_one(); } void CForeCastController::Reset() { { std::unique_locklt;std::mutexgt; notifyLock(m_mutexAlertNotification); m_bIsThreadExiting = true; notifyLock.unlock(); m_CondVarNotifyPending.notify_one(); } m_Notificationthread.join(); } int main() { std::shared_ptrlt;CForeCastControllergt; m_pForecastController = std::make_sharedlt;CForeCastControllergt;(); m_pForecastController-gt;SetAlertNotificationStatus(); m_pForecastController-gt;Reset(); return 0; }
Комментарии:
1. Начните работать с потоками изолированно, это облегчает обучение (кстати, не только для потоков). Кроме того, многие фреймворки пользовательского интерфейса не позволяют вносить изменения в пользовательский интерфейс из любого потока, а только из одного выделенного. Тем не менее, некоторые из этих фреймворков предлагают так называемые таймеры, которые могут быть лучшим выбором для вашего приложения именно потому, что они обрабатываются в потоке пользовательского интерфейса и фактически не выполняются одновременно.