LINUX.ORG.RU

C указатель на функцию.

 ,


0

1

Привет, сильно не бейте, я не программист. Подскажите как передать в функцию указатель на функцию, развлечения ради пытаюсь сделать небольшой таймер, что бы с помощью него выполнять произвольную функцию в заданный промежуток времени:

void mstimer(void(*)(),double ms);

void mstimer(void (*func),double ms){
    long int starttime = clock();
    while(clock()-starttime<ms*(CLOCKS_PER_SEC/1000)){
        starttime * 1;
    };
        mstimer(*func,ms);
}
void func2() {
    qDebug() << "Hello Crazy World!!!";
}

int main()
{
    mstimer(*func2,1000);
    return 0;
}

★★★★★
#include <stdio.h>
#include <time.h>
void mstimer(void (*func)(),double ms){
  while(1) {
    long int starttime = clock();
    while(clock()-starttime<ms*(CLOCKS_PER_SEC/1000)){
      usleep(1);
    }
    func();
  }
}
void func2() {
  printf("Hello Crazy World!!!\n");
}
int main() {
  mstimer(*func2,100);
  return 0;
}
anonymous
()
Ответ на: комментарий от anonymous

mstimer(*func2,100);

mstimer(func2,100);

Впрочем, и так и так компилятор съедает.

yoghurt ★★★★★
()

Код time.c:

#include <stdio.h>
#include <stdlib.h>
#include <sysexits.h>
#include <time.h>

void tick_func()
{
	struct timespec current_time;
	clock_gettime(CLOCK_REALTIME, &current_time);
	printf("tick at %llu\n", current_time.tv_sec);
}

void timer_func(void *_func, unsigned int _period)
{
	void (*tick) ();
	tick = _func;

	struct timespec start_time, end_time;
	clock_gettime(CLOCK_REALTIME, &start_time);
	unsigned long long start_time_ms = start_time.tv_sec * 1000L + start_time.tv_nsec / 1000000L;

	while (1)
	{
		clock_gettime(CLOCK_REALTIME, &end_time);
		unsigned long long end_time_ms = end_time.tv_sec * 1000L + end_time.tv_nsec / 1000000L;
		if (end_time_ms - start_time_ms >= _period)
		{
			tick();
			clock_gettime(CLOCK_REALTIME, &start_time);
			start_time_ms = start_time.tv_sec * 1000L + start_time.tv_nsec / 1000000L;
		} else
			continue;
	}

}

int main(int argc, char** argv)
{
	(void)argc;
	(void)argv;
	timer_func(tick_func, 1000);
	exit(EX_OK);
}

Вывод:

➜  ~  gcc -o timer timer.c
➜  ~  ./timer             
tick at 1388855508
tick at 1388855509
tick at 1388855510
tick at 1388855511
^C
post-factum ★★★★★
()
Ответ на: комментарий от splinter

И если действительно на этом будешь строить свои таймеры (хотя есть ведь готовые решения для этого), то там лучше CLOCK_MONOTONIC_RAW, чтобы не было скачков из-за NTP и ручного изменения времени.

Ну и таймер в отдельный поток.

post-factum ★★★★★
()
Последнее исправление: post-factum (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.