2016-09-17 9 views
1

Я попытался запустить следующий код и функция постоянно возвращается 0 после первого приема:uv_run постоянно возвращается успех навсегда

while (true) 
{ 
    int res = uv_run(uv_default_loop(), UV_RUN_ONCE); 
    if (res == 0) 
     printf("ok\n"); 
} 

Есть ли способ сбросить петлю, так что он будет возвращать 0 на второй получает и не будет зависеть от успеха от первого?

ответ

1

uv_run постоянно возвращается успех навсегда

В этом случае-не означает успеха.
Как уже упоминалось here для uv_run (курсив мой):

UV_RUN_ONCE: Опрос для ввода/вывода раз. Обратите внимание, что эта функция блокирует, если ожидающих обратных вызовов нет. Возвращает ноль при завершении (никаких активных ручек или запросов не осталось), или отличное от нуля, если ожидается больше обратных вызовов (это означает, что в будущем вы должны запустить цикл событий в будущем).

Если существует хотя бы один обратный вызов, вызов функции не будет блокироваться, и он выполнит их, после чего он вернется. Он опрос для ввода-вывода только один раз, он предназначен для этого, и вы спрашиваете: Возможно ли, что он работает по-другому, чем он предназначен? Ну, нет.
Вместо этого используйте UV_RUN_DEFAULT и закройте все ручки, когда закончите с ними, чтобы концы цикла и вызов функции вернулись.

+0

Привет skypjack и благодарю вас за ответ. Я пытаюсь исследовать libuv, поэтому он лучше всего подходит для игровой архитектуры. Я пытаюсь назвать его каждый фрейм, чтобы он не блокировал пользовательский интерфейс. это правильный путь? закрыть обработчики и снова инициализировать их каждый кадр или есть какой-то другой способ? –

+0

@Gabrielkotev Нет, если вы собираетесь иметь длительные операции, просто не закрывайте их. Например, дескриптор TCP, который перекликается с портом, должен оставаться включенным и работать, пока вы хотите предложить услугу. Я бы посоветовал вам прочитать документацию о libuv, все объясняется довольно хорошо. – skypjack