我想传递给我的Ctrl信号处理程序一个事件对象,以通知事件的其他线程并相应地执行它。
为了handle a console Ctrl signal,我们需要定义HandlerRoutine
并将其传递给SetConsoleCtrlHandler
函数。但是从HandlerRoutine
的{{3}}看来,我们可以传递给它的唯一参数是要处理的Ctrl信号的类型。
如何将其他参数传递给我的处理程序?
答案 0 :(得分:2)
由于您的处理程序基本上是无状态的,如果您希望一个线程通知所有线程,它将需要一个全局变量。一种可能性是使用单个全局来标记收到的事件。
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();
}