2014-01-30 49 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

相關問題