non*_*rly 3 c dll visual-studio-2017
我做了一个只有一个功能的简单c dll(在VS 2017中)。我从另一个C客户端程序使用此dll函数。调用是否异步(在与调用客户端程序不同的线程中运行)?如果不是,那么我需要运行异步并且如果dll函数是一个长时间的过程(或者当它想要通知事件的调用程序时),我需要从dll调用到调用(客户端)程序中的回调函数管理事件(我想使用函数指针)。
dll代码为:
#include <stdio.h>
__declspec(dllexport) void DllFunction() {
for (long i = 1;i <= 300000;i++) {
printf("dll\n");
}
}
Run Code Online (Sandbox Code Playgroud)
C客户端程序是:
#include <stdio.h>
__declspec(dllimport) void DllFunction(void);
int main() {
DllFunction();
for (long i = 1;i <= 300000;i++) {
printf("client\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行以前的客户端代码,我认为两个printf命令(dll和客户端)之间没有干扰!
更新
首先要做的是...搜索之后,我意识到我们可以将回调功能与异步调用分开。我们可以有一个驻留在调用(客户端)代码中的回调函数,并从dll长时间进程中调用该回调函数,以例如在本文中很好地描述了有关进度的通知: 在DLL中使用回调
因此,它仍然是异步的第二个问题... CreateThread()函数呢。我可以使用吗?如果是,则必须在dll或客户端代码中使用?
不,您可以将DLL调用视为普通函数调用。没有什么特别的事情发生,只是因为目标函数恰好位于DLL中。
实际上,可能会有一个间接表或其他东西,因此可能会有额外的跳转,但实际上,它仍然只是直接跳转到代码,就像程序中的任何其他函数调用一样。
如果要异步,则必须自己构建它,而使一组函数在单独的任务/线程中运行并不是一件容易的事。