我必須使用 .dll 庫才能訪問我想要控制的硬體。
問題是,該 dll 的某些功能有時不會回傳。他們似乎陷入了無限回圈或其他什么東西。
我的想法是在不同的執行緒中運行函式呼叫,并在執行緒卡住/一段時間后不回傳時終止執行緒。為了做到這一點,我寫了類似的東西:
template<typename... multiple>
void MyClass::genericCommandHandler(void *function, multiple... args)
{
//timer start --> check somewhere else
std::thread t{&MyClass::threadWorker<void(*)(...)>, function, args...};
t.join();
}
但它不編譯:error C2672: 'std::invoke': no matching overloaded function found
另一個問題是 std::thread 沒有終止或停止功能。
有沒有人對如何處理不回傳的 dll 有一個好主意?
uj5u.com熱心網友回復:
在自己的執行緒中隔離 DLL 并沒有太大幫助,但這個想法是有道理的。將 DLL 隔離在它自己的輔助行程中可能會更好。然后,您將終止整個幫助程式行程。
這必然不是一個干凈的出口。這是問題所固有的。您不知道 DLL 如何破壞內部狀態。這就是輔助行程存在的原因:避免混淆 DLL 狀態和您的狀態。
管理子行程的 C 標準方法是std::system,但這與控制有相同的問題。你需要原生的CreateProcess。
作為一種霰彈槍方法,您可以嘗試CancelSynchronousIo使用 DLL 的執行緒。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/478893.html
