|
楼主 |
发表于 2008-10-8 13:34:51
|
显示全部楼层
- #if defined(WIN32) || defined(_WIN32_WCE)
- #include "ortp-config-win32.h"
- #else
- #include "ortp-config.h"
- #endif
- #include "ortp/ortp.h"
- #include "rtptimer.h"
- #if !defined(_WIN32) && !defined(_WIN32_WCE)
- #ifdef __linux__
- #include <sys/select.h>
- #endif
- #include <sys/time.h>
- #include <sys/types.h>
- #include <unistd.h>
- static struct timeval orig,cur;
- static uint32_t posix_timer_time=0; /*in milisecond */
- void posix_timer_init()
- {
- posix_timer.state=RTP_TIMER_RUNNING;
- gettimeofday(&orig,NULL);
- posix_timer_time=0;
- }
- void posix_timer_do()
- {
- int diff,time;
- struct timeval tv;
- gettimeofday(&cur,NULL);
- time=((cur.tv_usec-orig.tv_usec)/1000 ) + ((cur.tv_sec-orig.tv_sec)*1000 );
- if ( (diff=time-posix_timer_time)>50){
- ortp_warning("Must catchup %i miliseconds.",diff);
- }
- while((diff = posix_timer_time-time) > 0)
- {
- tv.tv_sec = diff/1000;
- tv.tv_usec = (diff%1000)*1000;
- #if defined(_WIN32) || defined(_WIN32_WCE)
- /* this kind of select is not supported on windows */
- Sleep(tv.tv_usec/1000 + tv.tv_sec * 1000);
- #else
- select(0,NULL,NULL,NULL,&tv);
- #endif
- gettimeofday(&cur,NULL);
- time=((cur.tv_usec-orig.tv_usec)/1000 ) + ((cur.tv_sec-orig.tv_sec)*1000 );
- }
- posix_timer_time+=POSIXTIMER_INTERVAL/1000;
-
- }
- void posix_timer_uninit()
- {
- posix_timer.state=RTP_TIMER_STOPPED;
- }
- RtpTimer posix_timer={ 0,
- posix_timer_init,
- posix_timer_do,
- posix_timer_uninit,
- {0,POSIXTIMER_INTERVAL}};
-
复制代码
谢谢楼上的指教。
上面是oRTP中的posixtimer.c(去掉了win32部分)。为了便于说明问题,我只好贴这么长,不好意思。
我的疑问是,在声明RtpTimer posix_timer这个变量的时候,它会自动地把posix_timer_init, posix_timer_do,和posix_timer_uninit三个函数执行一遍吗?
如果不是,那么怎么把这三个函数用起来,怎么来执行它们?
是这样写吗:posix_timer.posix_timer_init
我仿造了个例子如下
- #include <stdio.h>
- #include <stdlib.h>
- typedef void (* FUNC)(void);
- typedef struct _mystruct
- {
- int item;
- FUNC AnyWords;
- } MyStruct;
- void SetItem()
- {
- test.item = 10;
- }
- MyStruct test = {0, SetItem};
- int main()
- {
- printf("--- test start ---\n");
- printf(" item is %d\n", test.item);
- exit(0);
- }
复制代码
上面有错误,在void SetItem里,test是未声明的变量.
但是我把MyStruct test声明在void SetItem()前面的话,SetItem又变成未声明。
真奇怪,源码是如何做到的呢? |
|