2010-01-18 65 views
2

我正在開發一個項目,我必須對一些硬件功能做一個包裝。包裝到硬件功能

我們必須在非易失性存儲器中寫入和讀取數據。我有一個庫,具有賣家公司的讀寫功能。問題在於,由於硬件特性,應在每次通話之間延遲調用這些功能。

所以我的解決方案是啓動一個線程,創建一個隊列,並使自己的讀寫功能。所以每次調用我的函數時,數據都會存儲在隊列中,然後在循環線程中將實際讀取或寫入內存。我的函數將使用互斥鎖來同步對隊列的訪問。我的包裝將在一個DLL上。主模塊會調用我的dll init函數來啓動線程,然後它會從不同線程多次調用我的讀/寫函數。

我的問題是:這樣做是否安全?原始功能不可重入。我不知道這是否會成爲問題。有一個更好的方法嗎?

任何幫助將不勝感激。


對不起,我忘了什麼事:

使用-The語言是C++

-The主程序會打電話給我包裝DLL也將調用其他模塊(DLL)中所要調用封裝器DLL。

+0

請在標題或標籤中指定您正在使用的語言,它將幫助有答案的人找到您的問題。 – STW 2010-01-18 16:12:11

+0

The Language is C++ – kepler 2010-01-18 16:18:31

+0

- 主程序將調用我的包裝DLL,但也會調用其他模塊(DLL),這將調用包裝DLL。 – kepler 2010-01-25 17:53:36

回答

0

在這種情況下添加一箇中介是一個非常典型的解決方案,所以你沒有在這裏的雜草。我會說你需要實現這個,因爲原始函數不可重入。當然,假設您擁有對硬件的訪問權限。 (即你是司機)。如果其他人可以訪問同一塊硬件,那麼你將不得不拿出一些更高級別的合同。您的線程然後提供對驅動程序的有序訪問。你會發現調解者也會讓你加油。

看起來很難的部分是知道什麼時候可以打電話給設備。它是否有某種標誌讓你知道它已準備好讀取和寫入?其他一些問題:您如何計劃與客戶溝通狀態?由於您提供了異步界面,因此您需要進行某種錯誤回調註冊等。請查看正常的異步驅動程序界面以獲取想法。

但總的來說,聽起來像是一個很好的策略。正如另一張海報所提到的,更具體的內容會很好。

+0

感謝您的回答安德魯... 我沒有標誌,我只是要等待下一個電話100毫秒。 現在還不知道如何告訴我的客戶寫入功能已成功完成。 – kepler 2010-01-18 16:26:39

+0

這裏有幾個選項。 1)當他們打電話給他們時,他們給你回電話。當你完成寫作並且他們可以發佈另一個時,你可以給他們打電話。 2)當他們打電話給寫者時,他們給他們一張有「isDone()」的收據或他們可以打電話來查看你是否完成的收據。 我寧願自己的第一種方法。但是當你給他們打電話時要小心。如果你在你的線程中調用它們,那麼它們可能會阻塞你的線程。您可能想要爲這些回調創建另一個線程。這聽起來像你可能想鼓勵雙緩衝。 – 2010-01-20 12:33:26