Я не вижу простого способа сделать это.Вы можете «смоделировать» событие в целях тестирования.
Обернуть событие в объект C ++ и изменить весь код для использования его методов.
class MockEvent {
public:
MockEvent () : m_handle(::CreateEvent(NULL, TRUE, FALSE, NULL) {}
~MockEvent () { ::CloseHandle(m_handle); }
BOOL Set() { return ::SetEvent(m_handle); }
DWORD Wait(DWORD timeout = INFINITE) {
return ::WaitForSingleObject(m_handle, timeout);
}
private:
HANDLE m_handle;
// Do not implement copy or assignment:
MockEvent(const MockEvent &);
MockEvent &operator=(const MockEvent &);
};
Тогда вам захочетсяиспользуйте некоторый указатель подсчета ссылок, который можно передать и скопировать так, как это может быть в оригинальной HANDLE:
typedef std::tr1::shared_ptr<MockEvent> MockEventPtr;
Замените весь код, который использует необработанную HANDLE, на MockEventPtr.
// Original code:
HANDLE hEvent = CreateEvent(NULL, true, false, NULL);
// Becomes:
MockEventPtr pEvent(new MockEvent);
// Original code:
SetEvent(hEvent);
// Becomes:
pEvent->Set();
И т. Д.
Теперь для вашего диагностического жгута вы можете расширить MockEvent для отслеживания состояния и предоставить метод для отображения текущего состояния.
class MockEvent {
public:
MockEvent () :
m_handle(::CreateEvent(NULL, TRUE, FALSE, NULL),
m_signaled(false) {
::InitializeCriticalSection(&m_cs);
}
~MockEvent () {
::DeleteCriticalSection(&m_cs);
::CloseHandle(m_handle);
}
BOOL Set() {
::EnterCriticalSection(&m_cs);
m_signaled = true;
BOOL result = ::SetEvent(m_handle);
::LeaveCriticalSection(&m_cs);
return result;
}
DWORD Wait(DWORD timeout = INFINITE) {
::EnterCriticalSection(&m_cs);
DWORD result = ::WaitForSingleObject(m_handle, timeout);
if (result == WAIT_OBJECT_0) {
m_signaled = false;
}
::LeaveCriticalSection(&m_cs);
return result;
}
// The result of this may be obsolete by the time you get it.
bool IsSignaled() const { return m_signaled; }
private:
HANDLE m_handle;
bool m_signaled;
CRITICAL_SECTION m_cs;
// Do not implement copy or assignment:
MockEvent(const MockEvent &);
MockEvent &operator=(const MockEvent &);
};
Этоэто непроверенный кодВ реальном коде я бы тоже обернул CRITICAL_SECTION.Обратите внимание, что результат IsSignaled может устареть в тот момент, когда вы его получите, если другой поток изменяет состояние.Я предполагаю, что это для тестирования кода, который будет проверять в то время, когда состояние должно быть определенным образом.