2012-05-14 128 views
2

我想用一個隊列來同步訪問一個串行端口,這個串行端口在多個獨立的代碼塊之間共享。 每個模塊都提供了一個回調函數,當需要時,它將被排隊並在串口上精確地處理一個原子操作。 一個計時器然後定期執行所有未決的操作,希望沒有干涉。因爲我對C++/CLI編程相對比較陌生,所以我能夠創建一個系統::集合::隊列並且使一些字符串入隊;但我不能,在我的生活中,弄清楚如何使用指向我的回調函數的指針(void Test())。C++/CLI:成員函數指針隊列

我使用Google搜索,但即使是最簡單的例子也不適合我。所有這些代表,Boost,Marshal,gcnew的東西現在讓我有些困惑。

我正在使用Microsoft Visual C++ 2010 Express。 希望你能幫助!從德國

問候,

保羅

+0

我通常會避免自己使用委託和幻想回調,並堅持通過繼承進行回調,因爲這對我更有意義。如果您需要遍歷託管/非託管層,那麼在C++/CLI中編寫包裝將不太困難,該包裝將充當中間回調層,將呼叫傳遞到託管環境。至少我認爲它比學習將函數編碼到函子等更容易。 – Ian

回答

1

在.NET/CLR世界System.Delegate類是函數指針的類似物。

由於您正在做一些低級別的事情,並且回調是在高級管理環境中編寫的,因此需要進行封送處理。

使用託管函數指針作爲本地回調如果你有System.Delegate實例的隊列中,你需要這個MSDN文章

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getdelegateforfunctionpointer(v=vs.80).aspx

,那麼就做D.DynamicInvoke()與列表調用適當的論據。

+0

我_think_你誤會了我:我沒有任何問題訪問串口,因爲_System :: IO :: Ports :: SerialPort_適合我。我真正想要做的就是將函數放入隊列中(以及在執行之後)。隊列,定時器和回調函數實際上都在同一個類中。回調函數沒有限制,也可以管理或不管理。 (因此,我的示例函數名稱是_void Test()_,它可能也是_System :: Void Test()_。但是請等待,這是否會區分託管和非託管代碼?) –

+0

因此,您有一個事件你想在隊列中「存儲」函數調用,然後在另一個事件中,你想從隊列中「彈出」函數調用並執行它?我知道你提到的串口是不相關的,但是將非託管函數指針轉換爲.NET代表需要一些工作。 –

+0

確切地說;我想我應該讓我的觀點更清楚。 –