Привет всем, я создал DLL в C ++, и я использую ее в C #, как:
[DllImport("IMDistortions.dll", CallingConvention = CallingConvention.Cdecl)]
public static unsafe extern void ProcessBarrelDistortion(byte* bytes, int stride, int width, int height, byte pixelSize, double a, double b, double c, double d);
Все работает нормально, но эту функцию я вызываю в функции BackgroundWorker DoWork, и я хотел бы остановить функцию, используя код:
if(cancel)return;
В моей c ++ DLL, где cancel — это указатель на рабочий CancelationPending, но CancelationPending — это свойство, поэтому я не могу получить указатель на него, например:
bool *cancel=&worker.CancelationPending;
А затем отправить его в качестве аргумента в моей функции. Кто-нибудь может мне помочь, как решить эту проблему? Также ищу отчет о проделанной работе, но не так сильно.
Вы можете использовать функцию обратного вызова (аналогичное решение может быть применено к «отчету о проделанной работе»).
В твоем c ++ .dll
//#include <iostream>
typedef bool ( *CancellationPending)();
extern "C" __declspec(dllexport) void ProcessBarrelDistortion
(
unsigned char* bytes,
int stride,
int width,
int height,
unsigned char pixelSize,
double a,
double b,
double c,
double d,
CancellationPending cancellationPending //callback
)
{
bool cancellationPending = cancellationPending();
if (cancellationPending)
{
return;
}
//std::cout << cancellationPending;
}
в проекте C #
public delegate bool CancellationPending();
[DllImport("YourDll.dll", CallingConvention = CallingConvention.StdCall)]
public static unsafe extern void ProcessBarrelDistortion
(byte* bytes,
int stride,
int width,
int height,
byte pixelSize,
double a,
double b,
double c,
double d,
CancellationPending cancellationPending);
static void Main(string[] args)
{
var bg = new BackgroundWorker {WorkerSupportsCancellation = true};
bg.DoWork += (sender, eventArgs) =>
{
Console.WriteLine("Background work....");
Thread.Sleep(10000);
};
bg.RunWorkerAsync();
unsafe
{
ProcessBarrelDistortion(null, 0, 0, 0, 0, 0, 0, 0, 0,
() => bg.CancellationPending);
}
bg.CancelAsync();
unsafe
{
ProcessBarrelDistortion(null, 0, 0, 0, 0, 0, 0, 0, 0,
() => bg.CancellationPending);
}}
Других решений пока нет …