関数を呼び出したいのですが、たとえば10秒または20秒ごとに呼び出します。検索したところ、どこにでもスレッドとsleep()
メソッドがありました。
また、Cで時間と時計のクラスを確認しましたが、質問に固有の役立つものは見つかりませんでした。
関数を定期的に呼び出す最も簡単な方法は何ですか?
関数を呼び出したいのですが、たとえば10秒または20秒ごとに呼び出します。検索したところ、どこにでもスレッドとsleep()
メソッドがありました。
また、Cで時間と時計のクラスを確認しましたが、質問に固有の役立つものは見つかりませんでした。
関数を定期的に呼び出す最も簡単な方法は何ですか?
ほとんどのオペレーティングシステムには、「アラームを設定する」または「タイマーを設定する」方法があります。これにより、将来の特定の時間にユーザーの関数が呼び出されます。Linuxではを使用alarm
し、Windowsではを使用しますSetTimer
。
これらの関数には、呼び出される関数で実行できる操作に制限があり、スレッドが呼び出されていない場合でもsleep
、代わりにいくつかのwait_for_event
または同様の関数が使用されることになります。
編集:ただし、以下を含むスレッドでスレッドを使用します。
while(1)
{
sleep(required_time);
function();
}
問題は非常に簡単な方法で解決され、処理が非常に簡単になります。
私の意見では、 Uselibevent
はよりクリーンなソリューションです。それまでの間、他の操作(他の時限関数でも)を実行できるからです。
3秒ごとにHelloを出力するこの単純で自明の例を見てください。
#include <stdio.h>
#include <sys/time.h>
#include <event.h>
void say_hello(int fd, short event, void *arg)
{
printf("Hello\n");
}
int main(int argc, const char* argv[])
{
struct event ev;
struct timeval tv;
tv.tv_sec = 3;
tv.tv_usec = 0;
event_init();
evtimer_set(&ev, say_hello, NULL);
evtimer_add(&ev, &tv);
event_dispatch();
return 0;
}
素朴な解決策は次のようになります。
/* Infinite loop */
time_t start_time = time(NULL);
for (;;)
{
time_t now = time(NULL);
time_t diff = now - start_time;
if ((diff % 10) == 0)
{
/* Ten seconds has passed */
}
if ((diff % 20) == 0)
{
/* Twenty seconds has passed */
}
}
関数が呼び出されたかどうかを示すフラグが必要な場合があります。そうでない場合は、1秒間に数回呼び出され(diff % 10) == 0
ます。
これを試して:
while(true) {
if(System.getNanotime % 20 == 0) {
myFunction();
}
}
これはJava構文です。5年以上cをプログラムしていませんが、おそらくそれはあなたを助けます:)
単純:
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char** argv)
{
while(1)
{
usleep(20000) ;
printf("tick!\n") ;
}
}
usleep()はもちろんブロックすることに注意してください:)