#windows #glib #event-loop #libuv #io-completion-ports
#Windows #glib #цикл событий #libuv #завершение ввода-вывода-порты
Вопрос:
Я нахожусь в очень неудачном положении, когда мне нужно взаимодействовать с libuv nodejs и MainLoop GLib во всех трех основных операционных системах. Мне нужно чередовать как основной цикл libuv, так и цикл управления GLib, чтобы обе части проекта могли быть счастливы и жить вместе. В unix это достаточно просто, потому что libuv возвращает дескриптор файла для опроса:
GSource source;
// ...
g_source_add_unix_fd (amp;source->source,
uv_backend_fd (loop),
(GIOCondition) (G_IO_IN | G_IO_OUT | G_IO_ERR));
Однако в Windows нет файлового дескриптора для опроса. Доступен дескриптор порта завершения ввода-вывода в uv loop->iocp
. Я не совсем уверен, как действовать дальше. Я подумал, что мне, вероятно, следует использовать следующую функцию из GLIB:
void
g_source_add_poll (GSource *source,
GPollFD *fd);
Но тогда мне нужно было бы создать GPollFD
из этого, и я не уверен, как это сделать или если это правильный вариант. Приветствуется любой намек, который может помочь мне продвинуться.
Соответствующая ссылка: https://github.com/romgrk/node-gtk/blob/master/src/loop.cc#L68-L75
Комментарии:
1. все, что можно сделать с
loop->iocp
помощью callGetQueuedCompletionStatus[Ex]
илиNtRemoveIoCompletion
на нем. но я не просматриваю такие вызовы в node-gtk . таким образом, эта библиотека не может работать с iocp . вам нужно самостоятельно обработать этот случай в Windows2. Прошло так много времени с тех пор, как мне приходилось это делать, я не хочу пытаться отвечать, но IIRC лучшее решение — использовать g_io_channel_win32_make_pollfd для создания a
GPollFD
из aGIOChannel
. Я думаю, что это сработает_open_osfhandle
. Удачи :/3. @nemequ — потому что в glib нет вызовов GetQueuedCompletionStatus[Ex] или [Zw / Nt]RemoveIoCompletion — это в любом случае не может работать с iocp