Ответ 1
Я не вижу простого способа сделать это. Вы можете "высмеять" событие для целей тестирования.
Оберните событие в объект С++ и измените весь код на использование его методов.
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 &);
};
Затем вы захотите использовать какой-то ссылочный подсчитанный указатель, который можно передать и скопировать способ, которым может быть оригинальная РУЧКА:
typedef std::tr1::shared_ptr<MockEvent> MockEventPtr;
Замените весь свой код, который использует необработанную РУЧКУ с помощью 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 может быть устаревшим в тот момент, когда вы его получите, если другой поток изменит состояние. Я предполагаю, что это для тестирования кода, который будет проверяться в то время, когда состояние должно быть определенным образом.