2012-02-22 3 views
0

Я работаю над приложением C# и сталкиваюсь с этой странной проблемой. У меня есть .dll, который был построен на C++, и мне нужно вызвать некоторые функции из этого .dll из приложения C#.Избегайте этого состояния гонки в программе 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; 
} 

Проблема заключается в том, когда я запускаю StartMain() функцию из .dll, то вычислить некоторые значения для int и char, которые должны быть отнесены к переменным (которые фактически возвращены в приложение C#)

Но после StartMain() приложение C# должно подождать до завершения функции StartMain() (которая в этом случае занимает ок. 3-4 сек, а сама dll запускает два/три других процесса), и только затем продолжить дальше или иначе, переменные x и sb в приложении C# будут иметь пустые/бессмысленные значения.

Как я могу достичь этого в этом случае?

+0

Я не вижу проблемы. Функция 'StartMain' будет работать до тех пор, пока работа не будет выполнена. Когда работа завершена, приложение C# получит контроль над исполнением и продолжит вызов 'ReturnIntExp'. Здесь нет проблем. – Dialecticus

ответ

2

Добавить третью экспортированную переменную ReturnIsReady(), которая возвращает true, если другие два метода имеют значимые данные и false в противном случае. Затем просто запустите цикл со сном, чтобы проверить это значение до тех пор, пока оно не изменится.

Лучшим вариантом было бы реализовать мьютекс или аналогичную структуру, но ожидание очереди должно быть достаточным для одиночного ожидания этой длины при запуске.

В качестве альтернативы, почему StartMain() возвращается перед заполнением значений?

+0

Можно ли это также сделать в StartMain(), чтобы вернуть конец кода int в конце. Таким образом, я мог бы продолжать проверять цикл для этого кода, пока он не даст мне зеленый сигнал. Потому что я не могу узнать, что на самом деле было бы для 'xExp' и' cExp' в этом случае. – Cipher

Смежные вопросы