Убедитесь, что одна функция выполняется один раз за раз - PullRequest
1 голос
/ 05 марта 2020

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

Я говорю о сгенерированном событием вызове функции в MF C c ++ VS2019 windows, поэтому вызов функции неуправляем.

например

BEGIN_MESSAGE_MAP(CMyWnd2, CWnd)
   ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
END_MESSAGE_MAP()

// inside the class declaration
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

LRESULT CMyWnd2::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
   UNREFERENCED_PARAMETER(wParam);
   UNREFERENCED_PARAMETER(lParam);

   // The task here might take some time to finish execution.

   return 0;
}

Я хочу убедиться, что при выполнении OnMyMessage(WPARAM wParam, LPARAM lParam) любой другой вызов этой функции должен быть проигнорированным.

1 Ответ

1 голос
/ 05 марта 2020

Немного неясно, как можно вызвать OnMyMessage, когда вы все еще в OnMyMessage.

Но в любом случае, возможно, это поможет: это не предотвратит вызов OnMyMessage, но однажды в OnMyMessage мы просто проверяем, есть ли еще текущий OnMyMessage, и в этом случае мы просто ничего не делаем.

LRESULT CMyWnd2::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
   UNREFERENCED_PARAMETER(wParam);
   UNREFERENCED_PARAMETER(lParam);

   static bool inMyMessage;

   if (inMyMessage)
     return 0;

   inMyMessage = true;

   // The task here might take some time to finish execution.

   inMyMessage = false;    
   return 0;
}
...