Как реализовать функцию setTimeout () Javascript в C (не в C ++) - PullRequest
1 голос
/ 23 февраля 2020

Название говорит само за себя. Я видел решения в C ++. Например, это , а некоторые (также C ++) довольно старые. Я открыт для использования glib или любой другой библиотеки с открытым исходным кодом. Я забочусь только о Linux реализации.

Я натолкнулся на функции таймера glib , но все они синхронны по своей природе и не близки к тому, что делает setTimeout ().

Я могу придумать одно решение: отдельный поток, который постоянно, в al oop, проверяет, истек ли таймер, такой как предоставленный Glib, и затем запускает соответствующую функцию. Конечно, это было бы смехотворно неэффективно.

Я также сталкивался с этим здесь , который предполагает использование тревоги (2). Это может быть использовано, но гранулярность только в секундах.

РЕДАКТИРОВАТЬ: Увы, тревога () отменяет любую ранее установленную тревогу ()

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Если вы хотите использовать GLib и ее источники тайм-аута (g_timeout_add(), g_timeout_add_seconds(), et c.), То вам нужно будет запустить GLib main l oop (GMainLoop) и запустите остальную часть вашего приложения в основном обратном вызове l oop. Это будет довольно большое изменение, если ваше приложение еще не написано в стиле, управляемом событиями, но будет необходимо для опроса сокетов или запуска интерфейса в любом случае.

Есть пример того, как использовать тайм-аут источник в приложении здесь .

Обратите внимание, что API таймера GLib (g_timer_*()) не предназначен для запуска обратных вызовов после определенного времени ожидания, он предназначен для определения времени, которое занимает что-то (например, секундомер) , Здесь это не актуально.

1 голос
/ 23 февраля 2020

Вы упоминаете, что вам нужно более одного таймера в вашем процессе, поэтому вам может потребоваться семейство функций POSIX timer_* (timer_create, timer_settime и т. Д. c). Они имеют наносекундную зернистость. Вы можете указать несколько различных действий для истечения времени таймера: поднять сигнал или вызвать функцию из отдельного потока. Вы должны связаться с -lrt, чтобы использовать эти функции.

Существует также timerfd_create, который позволяет определять истечение времени таймера, когда файл становится читаемым, используя poll или select или их родственников.

...