2012-02-22 41 views
0

我正在研究C#應用程序,並在這裏面臨一個奇怪的問題。我有一個使用C++構建的.dll文件,我必須從C#應用程序中的這個.dll文件中調用一些函數。在C#程序中避免這種競態條件

考慮下面的示例代碼:

public partial class MainWindows: Window 
{ 
public MainWindow() 
{ 
InitializeComponent(); 
ConfigurationFunctions.StartMain(); //Start main is the DLL function in C++ 

int x = ConfigurationFunctions.ReturnIntExp(); 
StringBuilder sb = ConfigurationOptions.ReturnSomethingExp(); 
} 
} 

C++ cpp文件

EXPORT_API int xExp; 
EXPORT_API char cExp; 
EXPORT_API StartMain() 
{ 
//Calculate `x` and `y` in this program values here and allocate to variables to be returned from function 
xExp = x; 
cExp = c; 
} 
EXPORT_API int ReturnIntExp() 
{ 
return xExp; 
} 
EXPORT_API char ReturnSomethingExp() 
{ 
return cExp; 
} 

問題是,當我請從.dll中StartMain()功能,它計算用於int一些值和char必須分配給變量(實際返回到C#應用程序)

但是,在StartMain()之後,C#應用程序應該等待StartMain()函數完成(在這種情況下, 3-4秒,並且dll本身會觸發兩個/三個其他進程),然後才能繼續進行,否則,C#應用程序中的變量xsb將具有空值/無意義的值。

如何在這種情況下達到相同的效果?

+0

我沒有看到問題。函數'StartMain'將工作,直到工作完成。工作完成後,C#應用程序將獲得執行控制權並將繼續調用'ReturnIntExp'。這裏沒有問題。 – Dialecticus 2012-02-22 16:18:27

回答

2

添加第三個輸出變量ReturnIsReady(),如果其他兩種方法具有有意義的數據,則返回true,否則返回false。然後只需要一個帶有睡眠的循環來檢查該值,直到它發生變化。

一個更好的選擇是實現一個互斥體或類似的結構,但是旋轉等待應該足以在啓動時等待一段時間。

或者,爲什麼StartMain()在填寫值之前返回?

+0

這也可以在StartMain()中完成,最後返回一個「完成代碼int」。所以,我可以繼續檢查這個代碼的循環,直到它給我一個綠色的信號。因爲在這種情況下我找不到「xExp」和「cExp」實際上會是什麼。 – Cipher 2012-02-22 16:20:15