2015-11-08 106 views
0

我正在處理一個大型項目,我需要每隔n分鐘監視一次結構的進程。C編程 - 每隔n分鐘執行一次消息處理

結構的每個實例可能都有它自己的時間長度,以便進程執行它將要執行的操作。

舉一個例子,假設我監視客戶端連接,struct client。

當客戶端已被實例化,我將尋求結合的方法,如:

void add_Client_Monitor (client_t * client, int seconds) 

然後add_Client_Monitor應該能夠創建秒規定之後,將觸發一個計時器事件,也作用於客戶結構,通過這樣的方法,即像:

void timer_Update_Client(client_t * client) 

感謝

+0

您可以使用pthreads創建一個[timer](http://forums.devshed.com/programming-42/using-pthread-create-stopwatch-timer-592599.html)。 – erip

回答

1

你可以使用一個線程池(像這樣的一個github上.com/Pithikos/C-Thread-Pool或這一個github.com/mbrossard/threadpool)。 在您的add_Client_Monitor函數中,您可以將作業傳遞給具有要運行的特定函數的線程池。 作爲一個簡單的例子:

#include "thpool.h" 

typedef struct monitor_func_args { 
    client_t* client; 
    int seconds; 
} monitor_func_args; 

void* client_monitor_func(void* args){ 
    struct timeval timeout; 
    timeout.tv_sec = ((monitor_func_args*) args)->seconds; 
    timeout.tv_usec = 0; 
    while(1) { 
     // Do your stuff 
     select (0 ,NULL, NULL, NULL, &timeout); // "sleep" 
    } 
} 

void add_client_monitor (threadpool pool, client_t * client, int seconds) { 
    monitor_func_args* args = (monitor_func_args*) malloc(sizeof(monitor_func_args)); 
    args->client = client; 
    args->seconds = seconds; 
    thpool_add_work(pool, client_monitor_func, (void*) args); 
} 


int main(){ 
    threadpool thpool = thpool_init(10); // pool with 10 threads 

    client_t* client; // get it from somewhere 
    int timeout // get it from somewhere 

    add_client_monitor(thpool, &client, timeout) 

    thpool_destroy(thpool); 
    return 0; 
} 

我沒有看過這些線程池實現的全部代碼,但他們似乎是正確的。 當然還有很多其他的你可以使用。

+0

謝謝,這是一個很大的幫助。所以從本質上說,它不是創建一個計時器本身的情況,而是啓動一個可以觸發另一個函數的線程,並且在該函數內你可以讓它進入睡眠狀態。 –

+0

是的,這是一般的想法。沒問題:)乾杯 – rcmgleite

+0

最後一個問題,我可能有成千上萬的這些線程同時運行。我應該設置什麼池大小?該服務器有12個內核。線程本身監視客戶端音頻連接並每隔n分鐘注入30秒廣告。這些線程可能會在95%的時間內閒置,但在不同的時間單獨忙碌 –

相關問題