Как проверить BackgroundWorker CancelationPending в C ++ родной DLL

Привет всем, я создал 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;

А затем отправить его в качестве аргумента в моей функции. Кто-нибудь может мне помочь, как решить эту проблему? Также ищу отчет о проделанной работе, но не так сильно.

0

Решение

Вы можете использовать функцию обратного вызова (аналогичное решение может быть применено к «отчету о проделанной работе»).

В твоем 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);
}}
0

Другие решения

Других решений пока нет …