2013-07-16 22 views
1

我正在用C語言編寫一個程序,通過wifi連接到攝像機,並且可以控制縮放,當用戶想要執行這些功能時開始和停止錄製。在線程中定期調用函數C

初次連接攝像機後,我將不得不每隔5秒發送一次會話刷新命令。所以我的想法是,之後發送刷新命令每5 seconds.Something像最初的連接開始一個新的線程,

while(1) { 
    sendRefreshCommand(); 
    usleep(5000000); 
} 

這種想法OK,或有任何其他的方式來實現這一目標?


編輯:這是到目前爲止我的代碼來說明一點什麼我想做的事情。用戶被永久詢問他想做什麼。這僅用於測試目的。稍後,縮放和錄製命令將由程序自動執行。同時要求用戶每5秒鐘刷新一次會話。

#include <stdio.h> 
#include <unistd.h> 
#include <pthread.h> 
#include "camctrl.h" 

extern struct conf g_Config; 

void* sessionContinueThread(void *session_args){ 
    while(1){ 
     sessionContinue(g_Config.cam_ip); 
     usleep(3000000); 
    } 
} 

int main(){ 
int   sel; 
pthread_t session_thread; 
void  *arg2; 

readConfig("config2.json"); 

ConnectToCam(g_Config.cam_ip); 

arg2 = (void *) g_Config.cam_ip; 
pthread_create(&session_thread , NULL , sessionContinueThread , arg2); 
pthread_join(session_thread,NULL); 

while(1){ 
    printf("\n[0] Zoom Tele\n"); 
    printf("[1] Zoom Wide\n"); 
    printf("[2] Start Recording\n"); 
    printf("[3] Stop Recording\n"); 
    printf("[4] Session Continue\n"); 
    printf("[5]Stop\n"); 
    printf("Selection: "); 
    scanf("%d",&sel); 

    switch(sel){ 
     case 0: zoomTele(); break; 
     case 1: zoomWide(); break; 
     case 2: RecStart(); break; 
     case 3: RecStop(); break; 
     case 4: sessionContinue(g_Config.cam_ip); break; 
     case 5: exit(0); break; 
     default: break; 
    } 
} 
return 0; 
} 
+0

我不明白爲什麼不。 – tangrs

+0

@wedaPashi只是好奇:P?你爲什麼說**科爾**而不是**杆**? –

+0

@SuvP:因爲它確實是South Cole和North Cole。 :D如果你有足夠的好奇心,試試並花點時間閱讀珠穆朗瑪峯。 :D或Google:Mt. Everest North Cole – 2013-07-16 12:24:26

回答

0

你的想法是好看。您可以通過使用警報信號和信號處理程序來實現相同。初始化警報信號的信號處理程序,並通過傳遞5作爲參數來使警報信號上升。 5秒鐘後,你的進程收到一個sigalarm信號,它調用sigalrm的信號處理程序。在信號處理程序發送刷新命令並再次提升sigalrm 5秒鐘。這循環連續工作。但事情是你的主程序每次收到信號時都會停止執行

1

通常這是可以的。但也有一些注意事項,你應該想想:

  1. 你要訪問您的傳輸通道,以不得到一些很奇怪的,難以跟蹤和複製效果
  2. 不要設置超時時間同步對於刷新命令精確到5秒,採取例如比5s低一半或百分之幾。否則,你可能會受到抖動引起的影響。 (例如,如果攝像機的時基與PC的時基基本一樣精確,則如果您在5秒後發送請求,攝像機將在5秒+傳輸時間後獲得「保持活動狀態」消息,這將會是一個超時然後
  3. 考慮引入門衛線程或對象來序列化訪問您的溝通渠道,這會給你一些優化的機會,例如,我可以想象,如果你不需要發送保持活動只是發出一個命令
  4. 不要使用while(1)啓動線程,將線程引用一個值或一個事件對象,它允許你發信號通知它應該被終止的線程,這讓你有機會在關閉程序時清理所有東西。

如果您想要我進一步解釋一些注意事項,請告訴我。

編輯:進一步的解釋,以4: 你應該照顧你清理每次分配資源。當然,你可以依賴於操作系統,它可能會清理線程和東西,當它將你的進程拋出內存時,但這不是一個真正的好方法。 因此,在創建線程並運行程序之後,當程序退出時,還應該銷燬線程。要做到這一點,你當然可以調用一些立即終止線程的調用。其缺點是,你可能會發生一些事情(例如互斥體)處於未定義狀態。

這是什麼意思?想象一下,線程接受了互斥體,即將發送一些東西,並在該時間點完成主線程終止線程。在這種情況下,你的互斥鎖可能會保持鎖定狀態,而其他人無法獲得它。 (例如發送會話銷燬命令)。

因此,避免這種情況的解決方案是請求線程終止而不是強制從外部終止。該請求使線程有機會清理他可能分配或獲得的東西,然後退出。請求其他線程終止的線程在退出之前應該等待另一個線程(使用一種連接函數)。

+0

參考你的清單: 1.所以我應該在執行會話刷新命令之前使用phtread_mutex_lock並解鎖之後避免與平行發生控制命令衝突? 2.我已經考慮過這個問題,並嘗試每3秒發送一次,以確保不會超時。 3.還沒有想過。但很可能會在您發送控制命令時自動刷新會話。 4.我想我還沒有完全得到。你能解釋一下這點嗎? – user2586678

+0

1:這是一種解決方案,另一種解決方案是通過將互斥鎖和自由權合併到會話刷新功能中來使調用本身線程安全。 3:是的,當然只是一個小小的優化。 4:我試圖改進解釋。在答案中看到我的編輯。 – junix