我可以测试此策略是否发出自动重置事件信号吗?
Can I test whether an auto-reset event is signaled with this strategy?
我想发出包含自动重置事件状态的调试输出。这是为了帮助并发调试。
可以通过等待超时为零来测试自动重置事件的当前状态。不幸的是,这会重置事件。所以我想,我会先测试它,如果已经设置好了,就再设置一次。
从不可能改变应用程序其余部分的行为的意义上说,这种策略是否有效?
Would this strategy work in the sense that it can't possibly alter the
behavior of the rest of the application?
当然这会影响应用程序其余部分的行为。因为你不仅可以查询状态,还可以用它来改变事件的状态。
然而特殊的 api 存在(未记录)用于事件的查询信息 - 它的类型和状态(当然 api return 之后的状态可以在任何类型下更改)
typedef struct EVENT_BASIC_INFORMATION
{
EVENT_TYPE EventType;
LONG EventState;
} *PEVENT_BASIC_INFORMATION;
enum EVENT_INFORMATION_CLASS
{
EventBasicInformation
};
EXTERN_C
NTSYSAPI
NTSTATUS
NTAPI
NtQueryEvent (
_In_ HANDLE EventHandle,
_In_ EVENT_INFORMATION_CLASS EventInformationClass,
_Out_writes_bytes_(Length) PVOID EventInformation,
_In_ ULONG Length,
_Out_opt_ PULONG ReturnLength
);
用法示例
if (HANDLE hEvent = CreateEventW(0, 0, 0, 0))
{
EVENT_BASIC_INFORMATION ebi;
NtQueryEvent(hEvent, EventBasicInformation, &ebi, sizeof(ebi), 0);
SetEvent(hEvent);
NtQueryEvent(hEvent, EventBasicInformation, &ebi, sizeof(ebi), 0);
NtClose(hEvent);
}
请注意,自动重置 事件 - 这是 SynchronizationEvent 和 手动重置事件 - 这是 NotificationEvent
我想发出包含自动重置事件状态的调试输出。这是为了帮助并发调试。
可以通过等待超时为零来测试自动重置事件的当前状态。不幸的是,这会重置事件。所以我想,我会先测试它,如果已经设置好了,就再设置一次。
从不可能改变应用程序其余部分的行为的意义上说,这种策略是否有效?
Would this strategy work in the sense that it can't possibly alter the behavior of the rest of the application?
当然这会影响应用程序其余部分的行为。因为你不仅可以查询状态,还可以用它来改变事件的状态。
然而特殊的 api 存在(未记录)用于事件的查询信息 - 它的类型和状态(当然 api return 之后的状态可以在任何类型下更改)
typedef struct EVENT_BASIC_INFORMATION
{
EVENT_TYPE EventType;
LONG EventState;
} *PEVENT_BASIC_INFORMATION;
enum EVENT_INFORMATION_CLASS
{
EventBasicInformation
};
EXTERN_C
NTSYSAPI
NTSTATUS
NTAPI
NtQueryEvent (
_In_ HANDLE EventHandle,
_In_ EVENT_INFORMATION_CLASS EventInformationClass,
_Out_writes_bytes_(Length) PVOID EventInformation,
_In_ ULONG Length,
_Out_opt_ PULONG ReturnLength
);
用法示例
if (HANDLE hEvent = CreateEventW(0, 0, 0, 0))
{
EVENT_BASIC_INFORMATION ebi;
NtQueryEvent(hEvent, EventBasicInformation, &ebi, sizeof(ebi), 0);
SetEvent(hEvent);
NtQueryEvent(hEvent, EventBasicInformation, &ebi, sizeof(ebi), 0);
NtClose(hEvent);
}
请注意,自动重置 事件 - 这是 SynchronizationEvent 和 手动重置事件 - 这是 NotificationEvent