如何将参数传递给HandlerRoutine?

时间:2017-08-28 22:00:33

标签: c winapi event-handling

我想传递给我的Ctrl信号处理程序一个事件对象,以通知事件的其他线程并相应地执行它。

为了handle a console Ctrl signal,我们需要定义HandlerRoutine并将其传递给SetConsoleCtrlHandler函数。但是从HandlerRoutine的{​​{3}}看来,我们可以传递给它的唯一参数是要处理的Ctrl信号的类型。

如何将其他参数传递给我的处理程序?

1 个答案:

答案 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();
}