我想传递给我的ctrl信号处理程序一个事件对象,以通知事件的其他线程并相应地行为。
为了处理控制台CTRL信号,我们需要定义HandlerRoutine
并将其传递到SetConsoleCtrlHandler
函数。但是,从HandlerRoutine
的文档页面中,似乎我们可以传递给它的唯一参数是要处理的CTRL信号的类型。
如何将其他参数传递给处理程序?
由于您的处理程序本质上是无状态的,如果您希望一个线程通知所有线程,则需要一个全局变量。一种可能性是使用单个全局来标记收到的事件。
received_events revents;
BOOL handler (DWORD e) {
set_received_event(&revents, e);
wait_if_needed_for_threads_to_handle_event(&revents, e);
return TRUE;
}
然后,所有线程都必须检查此全局,以查看是否发生了一些感兴趣的事情:
extern received_events revents;
while (!done) {
if (received_an_event(&revents)) {
e = which_event(&revents);
/* ... */
mark_event_as_handled_maybe_exit_thread(&revents, e);
}
do_what_I_normally_do();
}