gpt4 book ai didi

c# - 在来自 c#(回调)的非托管 c++ dll 中使用循环操作

转载 作者:太空宇宙 更新时间:2023-11-04 12:14:18 24 4
gpt4 key购买 nike

我已经编写了一个运行良好的非托管 c++ dll (IPinvoke))) 其中有一个资源消耗函数 - 有一个具有复杂耗时逻辑的循环。计算此循环进度百分比并将中断发送到此循环的最佳方法是什么 - 使用回调或可能正在传递参数? 如果回调是最好的变体 - 谁能提供示例?

在动态链接库中:

extern "C" _declspec(dllexport) uint8* resourceConsumingFunction(uint8* dataBufer)
{
//there is a loop with many math here
return dataBuffer;
}

在 C# 中

[DllImport("MyLib.DLL", CallingConvention = CallingConvention.Cdecl)]
public unsafe static extern byte* resourceConsumingFunction(byte* dataBuf);
//.....
byte* bufbuf = resourceConsumingFunction(data);//there I need to break this function and to get //percentage

最佳答案

当然,回调可以工作。您将需要 C++ 代码中的函数指针,如下所示:

typedef void (__stdcall * pfnCallback)(int progress, int* cancel);

extern "C" _declspec(dllexport)
uint8* resourceConsumingFunction(uint8* dataBuffer, pfnCallback callback)
{
for (int progress = 0;;) {
int cancel = 0;
callback(progress, &cancel);
if (cancel) return null;
// More code
//...
}
return dataBuffer;
}

等效的 C# 代码为:

private void delegate pfnCallback(int progress, out bool cancel);

private void makeCall() {
var callback = new pfnCallback(showProgress);
var bufptr = resourceConsumingFunction(somebuf, callback);
GC.KeepAlive(callback);
// etc...
}

private void showProgress(int progress, out bool cancel) {
// etc...
}

使用 __stdcall 进行回调有助于保持委托(delegate)声明简单。 GC.KeepAlive() 调用对于阻止垃圾收集器过早收集委托(delegate)对象是必要的。

关于c# - 在来自 c#(回调)的非托管 c++ dll 中使用循环操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8401381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com