C ++ Windows MFC Параллельность: получите поток, ожидающий достижения определенного состояния

Что такое параллелизм в Windows MFC, как я могу сообщить текущему потоку, чтобы дождаться определенного состояния? Единственный способ, о котором я могу думать в данный момент, - выполнить периодический Сон и проверить состояние - когда мы в нужном состоянии, продолжим. Есть ли лучший способ сделать это?

BOOL achieved = FALSE;

int main (int argc, char** argv) {

 //This function creates a new thread and modifies the 'achieved' global variable at some point in the future
  doSomethingOnAnotherThread();

 //Wait maximum 4 seconds for 'achieved' to be TRUE, otherwise give up
  for(int i=0; i<5; i++) {
    EnterCriticalSection(&CS);
    int localAchieved = achieved;
    LeaveCriticalSection(&CS);

    if (!localAchieved) { 
      if(i==4) { 
        cout << "waited too long .. giving up" << endl; 
        break; 
      }
      Sleep(1000);//let's wait 1 more second and see what happen
    } else {
      cout << "achieved is TRUE, resuming main thread" << endl;
      break;
    }
  }
}
1
nl ja de
@Sergey Я думаю, он просто хотел привести пример того, что он уже пробовал
добавлено автор John Sibly, источник
Кстати, зачем использовать MFC для консольного приложения?
добавлено автор Sergey Brunov, источник
@JohnSibly, о, я вижу точку. Благодарю.
добавлено автор Sergey Brunov, источник
Возможно, будет полезно CEvent ? Возможно, с dwTimeout из 4000 ?
добавлено автор WhozCraig, источник

3 ответы

CEvent Class:

Представляет событие, которое является объектом синхронизации, который позволяет одному потоку уведомлять другого о событии.

Таким образом, это подходящий инструмент для решения проблемы.

Давайте проиллюстрируем это:

void DoSomethingOnAnotherThread(CEvent* event)
{
   //Long-running operation.
    ...

   //Sets the state of the event to signaled, releasing any waiting threads.
    event->SetEvent();

   //TODO: maybe add try/catch and SetEvent() always after the long-running operation???
}

int main (int argc, char** argv)
{
   //Manual-reset event.
    CEvent achieved_event(FALSE, TRUE);

   //This function creates a new thread and modifies the 'achieved' global variable at some point in the future
    DoSomethingOnAnotherThread(&achieved_event);

   //Wait the event to be signalled for 4 seconds!
    DWORD wait_result = WaitForSingleObject(achieved_event, 4000);

    switch (wait_result) {
    case WAIT_OBJECT_0:
        std::cout << "Achieved!" << std::endl;
        break;
    case WAIT_TIMEOUT:
        std::cout << "Timeout!" << std::endl;
        break;
    default://WAIT_FAILED
        std::cout << "Failed to wait!" << std::endl;
        break;
    }
}
4
добавлено
Спасибо, сэр, это, безусловно, самое убедительное решение.
добавлено автор gerrytan, источник

Instead of polling you could use WinAPI: See CreateEvent and WaitForSingleObject

2
добавлено

What you want to use are event objects.

2
добавлено
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

Про Windows
Про Windows
941 участник(ов)

Microsoft Windows и всё, что с этим связано. Список интересных групп и каналов: https://github.com/goq/telegram-list

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest