【问题标题】:How to return value from asynchronous function in dll如何从dll中的异步函数返回值
【发布时间】:2014-01-30 17:18:40
【问题描述】:

我的 dll 有异步函数,它启动一个线程并立即返回。它接受事件对象的句柄(类型HANDLE),线程在完成时发出信号。这工作正常,但我怎样才能从它传递的函数返回结果并且没有发生错误?一个简单的布尔类型就可以了。

我正在考虑使用 GetLastError() 类型的调用来获取最后一个函数的结果,但我并没有真正以这种方式出售。我还查看了 std::future 和 std::async 但我不确定是否可以在 dll 函数中使用它!?我想到的另一个选择是使用GetOverlappedResult,但它通常适用于文件 i/o,我不知道是否可以将它用于我编写的自定义函数。

【问题讨论】:

  • 看看std::future
  • 如果线程接受一个 arg (HANDLE),它可能接受一个指向 malloced 结构的指针(带有 HANDLE、bool 和一些 char[42] 用于小错误消息)。调用者应仅在事件发出信号时释放。
  • 你能将回调传递给“你的”DLL 函数吗?
  • @Chad 回调可以消除事件,它对返回值有何帮助?
  • 当值准备好返回时让DLL调用回调函数。

标签: c++ multithreading dll std


【解决方案1】:

Chad 是对的,回调是安全且简单的方法

// DLL:
__declspec(dllexport) void (*callback_function)(DWORD ret)=NULL;

DWORD _stdcall thread_function(LPVOID p)
 {
 // do something ...
 if (callback_function) callback_function(some_return_value);
 }

// DLL usage
DWORD return_value1=0;
bool done1=false;
void callback_function1(DWORD ret)
 {
 return_value1=ret;
 done1=true;
 }

void main()
 {
 callback_function=callback_function1; // set callbak function for DLL
 done1=false;                             // invalidate return value
 // here call you DLL function
 for (;!done1;) Sleep(1); // wait for valid result ... also can add some timeout to avoid hang-ups
 // now in return_value1 is the valid return value
 }

你也可以使用 waitforsingleobject 代替

【讨论】:

  • 我最终只传递了一个引用变量,就完成了工作!
  • 是的,但您应该检查其有效性以确保,因为即使胎面很快并且在创建后几乎立即停止,您也不能认为它是理所当然的。有时线程会因为操作系统进程管理而卡住一段时间,在这种情况下,您可以在返回值被覆盖之前读取它!!!。
  • 您不需要任何额外的变量,只需在 dll 函数启动时将返回值设置为某个安全值(例如 -1),然后在创建线程后等待返回变量不同这个值。 (使用睡眠,这样你就不会卡住!!!)当然 dll 在任何情况下都不能返回相同的值!!!
  • 不,我只在线程发出事件信号时才读取我的可引用变量,否则它的值是没有意义的。
猜你喜欢
  • 2021-03-04
  • 2020-07-29
  • 2022-01-14
  • 2018-01-03
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
相关资源
最近更新 更多