Как использовать потоки для получения блокировки в новом состоянии и освобождения через несколько долей секунды и возврата в предыдущее состояние с помощью C

#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. Начните работать с потоками изолированно, это облегчает обучение (кстати, не только для потоков). Кроме того, многие фреймворки пользовательского интерфейса не позволяют вносить изменения в пользовательский интерфейс из любого потока, а только из одного выделенного. Тем не менее, некоторые из этих фреймворков предлагают так называемые таймеры, которые могут быть лучшим выбором для вашего приложения именно потому, что они обрабатываются в потоке пользовательского интерфейса и фактически не выполняются одновременно.