2010-10-06 60 views
1

我對模板, 等高級C++程序技術相當陌生,但我正在爲正在開發的項目開發一個簡單的API。如何設計C++ API

您調用的函數或方法可能需要很長時間才能完成。 本質上它是通過網絡傳輸文件。

看起來有點像這樣。

Client 
{ 
    int WriteFile(); 
    int ReadFile(); 
} 

但我想在這裏有幾個選項。

  1. 調用WriteFile並讓它阻塞。
  2. 調用WriteFileAsync並沒有阻止。
  3. 在異步版本中,我可以靈活地知道如何完成任務。
  4. 能夠通過輪詢客戶端來找出我的當前讀取或寫入操作所處的位置。

我對如何設計這個很好的C++方式感到有點不知所措。 這是避免使用boost的必要條件,但我可以使用類似boost的方法。 雖然,我翻閱了一些頭文件,非常困惑。任何超出 基本模板編程的東西我都覺得困惑。

我所追求的是一種很好的方式來通知事件完成並能夠等待 事件完成。

+0

你想避免使用提升,但需要類似提升的方法。那麼,完全是什麼樣的助推式方法呢? – ereOn 2010-10-06 08:39:33

+0

我的意思是,如果有人提出ASIO的boost樣式解決方案會很好。唯一的問題是我不明白ASIO如何實施。模板地獄。 – Matt 2010-10-06 22:24:24

回答

2

我的建議是看文檔和教程的boost :: ASIO(可以作爲升壓的一部分或作爲獨立ASIO項目的一部分使用,但我想這要求是沒有外部庫,不只是沒有提升)。

阻塞調用通常很容易定義,而非阻塞操作需要一些回調機制,以便在完成時通知用戶操作結果。再次,看一下教程和文檔,瞭解一個乾淨的界面,比標題更容易瀏覽。

編輯:ASIO支持不同的協議,所以它可能比你需要的更復雜,讀一個例子,並得到如何使用回調機制的想法。

1

關於使用異步調用,我建議閱讀關於C++ 0x的future的設計。

基本上,這個想法是將代理交給用戶,而不是普通類型。此代理是知道的線程,並且可以用於:

  • 調查其完成
  • 得到的結果

您還可以添加巧妙的機制,就像試圖得到的結果爲固定持續時間或達到一個固定的時間點,如果任務未及時完成(例如,做其他事情,稍後再試,或簡單地繼續前進而忘記這一點),就放棄(暫時)。

C++ 0x的新線程API已經非常巧妙地設計了(主要在Boost.Threads之後),並且會給你很多關於如何設計多線程的見解。