2013-05-09 190 views
-1

我正在嘗試寫什麼應該是一個相當簡單的C++程序。這是三個部分組成:C++程序線程概念

  1. 串行客戶:要不斷輪詢串口服務器,並保存在一個表中接收到的值,具有無限的循環繼續查詢串行服務器
  2. 日誌:寫入當前表值與時間戳.csv文件每隔幾秒鐘
  3. 菜單:簡單的命令行菜單來啓動/停止服務器,並退出該程序

我曾嘗試使用並行線程和boost ::線程,使這個三項功能同時發生,但沒有太多運氣。

誰能爲我提供的這一切一點方向,我是新來的線程,也許線程甚至沒有去這裏的正道。

+1

請發佈您嘗試過的代碼的相關部分,以便人們可以告訴您它出了什麼問題。 – Mat 2013-05-09 12:15:15

+0

它應該使用'pthreads'。只要發佈代碼中您認爲出錯的部分。 [噓!在關閉之前要快速] – 2013-05-09 12:22:55

+0

提升對於創建線程並不是必須的。爲什麼不使用API​​來創建線程? – user1764961 2013-05-09 12:42:58

回答

1

這裏有一種方法可以做到你的要求:

boost::mutex mtx; 

void poll_thread() 
{ 
    while(!done) { 
     poll_for_data(); 
     if(data_received) { 
      boost::unique_lock<boost::mutex> lock(mtx); 
      //write data to table 
     } 
    } 
} 

void log_thread() 
{ 
    while(!done) { 
     sleep(1); 
     boost::unique_lock<boost::mutex> lock(mtx); 
     //log table to csv file... 
    } 
} 

int main() 
{ 
    //create and start the polling and logging thread 
    boost::thread th1(&poll_thread); 
    boost::thread th2(&log_thread); 

    //run the menu 
    while(!done) { 
     //... 
    } 

    th1.join(); 
    th2.join(); 

    return 0; 
} 

互斥量是必要的,以避免在不同的線程同時訪問表。

0

這是一個很常見的塞納里奧。

通常你的應用程序將有一個主線程將:

  1. 設置串行連接。
  2. 驅動器菜單(用戶輸入等)

然後串行連接將有聽線程。當數據在串行連接上被接收時,它將觸發一個數據接收事件,該事件將由主應用程序處理。通常,您可以使用許多可用的庫對象之一來簡化串行端口通信。這將使您無需設置和管理您的自我監聽線程。在這種情況下,您只需將您的應用事件處理程序連接到串行端口處理程序對象DataReceived事件。在C++世界中,最有可能的選擇是Boost.Asio。串口通訊對象也有很好的支持,這裏有一個很好的支持文章:CodeProject Serial library for C++

如果事件處理程序(在串口監聽線程上調用)和主應用程序線程都訪問某些共享數據(您提到的數據表),則需要使用同步主節點保護對該對象的訪問(例如CriticalSection,Mutex ,等),以避免併發訪問(一個線程(串行監聽線程)寫入或添加到數據結構,而另一個線程(主應用程序線程)正在讀取或從中讀取)。