2014-12-25 43 views
2

我創建了一個包含兩個函數的Matlab dll。功能1運行3-4毫秒,功能2運行約1秒。我需要在C#中持續運行Function1並且不時地運行Function2。我經歷過,當我運行Function2時,Function1不會連續運行,或者需要3-4毫秒以上(2-3秒範圍內的某些內容)。一旦Function2完成,Function1就返回到正常/快速狀態。這些是我已經嘗試過的:從一個Matlab DLL同時調用兩個函數

  1. 我在單獨的線程中調用Function2,但沒有運氣! (Function1也在單獨的線程中運行)。
  2. 我用backgroundworker而不是線程(以防萬一),沒有運氣!
  3. 我爲Function2創建了一個單獨的dll,並再次遇到相同的問題/延遲/延遲。

有沒有人有這個問題的任何想法/解決方案? Matlab是否在單線程中運行函數/代碼?如果沒有,是否有指定函數單獨的​​線程?

我很感激任何幫助。

回答

1

看起來你的直覺是正確的:即使源於多個線程,調用Matlab庫也會按順序執行。是指由彼得·韋伯的評論Creating C++ Shared Libraries and DLLs下:

可以調用庫從多個線程,但只有一個線程可以在圖書館隨時處於活動狀態。生成的庫受到信號量的保護,信號量一次只允許一個用戶線程進入生成的庫。嘗試調用共享庫的其他用戶線程將阻塞(等待),直到共享庫「空閒」。

[...]

圖書館用信號量保護自己。他們這樣做是因爲底層執行引擎(MCR)不是線程安全的。這意味着即使你可以禁用信號量,你也不想這樣做,因爲你可能得到不正確的結果或程序失敗。

如果您真的需要並行性,目前您最好的(也是唯一的)選項是使用單獨的進程。如果您的客戶端可以使用任何標準Web協議(HTTP或JSON)或Microsoft的專有擴展版本,使用WCF在單獨的進程中設置基於Web的WCF客戶端非常簡單。 (當然,在這種情況下,您的服務器必須在Windows機器上運行。)有關詳細信息,請參閱my WCF post

+0

感謝您的評論。你認爲他的建議解決方案適用於沒有任何Web服務的C#嗎? – NESHOM

+0

重點是使用單獨的進程來承載Matlab運行時。 WCF只是在所述過程之間建立通信的一種方式。如果你不想使用WCF,你需要使用一些其他的進程間通信方式。 – Douglas

+0

您能否將我引到頁面以獲取更多信息?我沒有得到「使用單獨的流程」部分。基本上我打電話給一個DLL。我看到,無論何時使用dll,Matlab.exe都出現在我的進程列表中。但我不知道如何爲此使用多個Matlab實例。謝謝 – NESHOM