C语言在指定时间调用函数

时间:2012-07-25 15:21:04

标签: c linux timer

我正在使用以下C代码(linux ubuntu)每隔5分钟对代理服务器进行一次采样并获得出价和询问价值:

int main(int argc, char *argv[])
{
struct stock myStock;
struct stock *myStock_ptr;
struct timeval t;
time_t timeNow;


strcpy(myStock.exchange,"MI");
strcpy(myStock.market,"EQCON");
strcpy(myStock.t3Id,"1");
strcpy(myStock.subscLabel,"");
strcpy(myStock.status,"0");
strcpy(myStock.ask,"");
strcpy(myStock.bid,"");

buildSubLabel(&myStock);

while (1) {
    t.tv_sec = 1;
    t.tv_usec = 0;

    select(0, NULL, NULL, NULL, &t);
    time(&timeNow);

    sample(&myStock);

    printf("DataLink on %s\n",myStock.subscLabel);
    printf("Time Now: --- %s",ctime(&timeNow));
    printf("DataLink Status---- %s\n",myStock.status);
    printf("Ask --- %s\n",myStock.ask);
    printf("Bid --- %s\n",myStock.bid);
    printf("###################\n");

}

return 0;
}

我无法做的是在特定时间安排样本功能。 我想调用样本函数 9.01第一次 9.05第二次 9.10第三次 9.15 ...... 9.20 ...... 等到17.30 在17.30之后,该过程应该终止。

祝你好运 马西莫

2 个答案:

答案 0 :(得分:2)

您应该使用线程在特定时间后调用所需的功能 做这样的事情:

#include <pthread.h>
#include <unistd.h> // for sleep() and usleep()

void *thread(void *arg) { // arguments not used in this case
    sleep(9); // wait 9 seconds
    usleep(10000) // wait 10000 microseconds (1000000s are 1 second)
    // thread has sleeped for 9.01 seconds
    function(); // call your function
    // add more here
    return NULL;
}

int main() {
    pthread_t pt;
    pthread_create(&pt, NULL, thread, NULL);
    // thread is running and will call function() after 9.01 seconds
}

另一种可以编写线程函数的方法(通过检查程序运行的时间):

void *thread(void *arg) {
    while ((clock() / (double)CLOCKS_PER_SEC) < 9.01) // check the running time while it's less than 9.01 seconds
        ;
    function();
    // etc...
    return NULL;
}

记住:你必须链接pthread库!如果您使用gcc,则为-lpthread

有关pthreads(POSIX线程)的更多信息,您可以查看本网站:
https://computing.llnl.gov/tutorials/pthreads/
并且在时钟功能上:
http://www.cplusplus.com/reference/clibrary/ctime/clock/

答案 1 :(得分:0)

完成处理后(即在printf之后),您需要计算延迟,因为处理需要时间。您也可以在17:30或更晚的时候结束循环。

如果您没有减少延迟,那么您不会在一天中的正确时间获得样品。