2014-01-30 51 views
1

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

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

+0

看看['性病安全,轻松地::未来'](http://en.cppreference.com/w/cpp/thread/future) – melak47

+0

如果线程接受一个arg(HANDLE),它可以接受一个指向mableced结构的指针(用HANDLE,a nd布尔,和一些字符[42]为一个小错误消息)。当事件发信号时,主叫方只应该释放。 – manuell

+1

你可以将回调传递给“你的”DLL函数吗? – Chad

回答

0

乍得是正确的回调是做

// 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的,而不是

+0

我最终只传递了一个参考变量,而且完成了这项工作! – zar

+0

是的,但你应该检查有效性只是为了确保,因为即使胎面速度很快,几乎立即停止后,你不能把它视为理所当然。有时候线程会因为OS进程管理而停滞一段时间,在这种情况下,您可以在覆盖之前读取返回值!!! – Spektre

+0

你不需要任何额外的变量,只需在dll函数开始时将返回值设置为某个安全值(例如-1),并在线程创建后等待,直到返回变量不同于此值。 (使用睡眠,所以你不会卡住!!!)当然,DLL无法在任何场合返回相同的值! – Spektre

相关问题