我正在编写一个包装器DLL,用于将横河电机WT1600功率计的通信DLL连接到基于PC的自动化软件包。我让通信部分工作,但我需要对其进行处理,以便可以保持自动化程序包的50ms扫描时间。 (扩展功能块(EFB)调用将阻止扫描,直到它返回)
这些是我需要做的步骤。
所以我的问题是,如何创建一个在调用函数的生命周期之后存在的线程?当我回调DLL时,如何获得该线程返回值?
编辑#1
HeavyFunction::HeavyFunction^ hf; //HeavyFunction is a class that has a time consuming function in it
ThreadStart^ efbThreadDelegate;
Thread^ efbThread;
if( pEfbData->nBlockingRecall != DOEFB_BUSY ) {
hf = gcnew HeavyFunction::HeavyFunction;
hf->iiStart = (int)(pEfbData->uParams[0].dw);
hf->iiEnd = (int)(pEfbData->uParams[1].dw);
efbThreadDelegate = gcnew ThreadStart( hf, &HeavyFunction::HeavyFunction::iGetPrime );
efbThread = gcnew Thread( efbThreadDelegate );
efbThread->Start();
return DOEFB_BUSY;
}else if ( efbThread->IsAlive ) {
return DOEFB_BUSY;
}else {
uRetValue->dw = hf->iReturn;
return 0;
}
efbThread在后续调用时是否仍然具有相同的线程句柄?
编辑#2
我通过为Mutex和线程创建全局HAND来实现它。初始化init入口点中的互斥锁(在dll加载时完成),并在实际对dll进行调用时在main函数中创建线程。
我使用MSDN: Creating Threads中的示例代码作为我的模型。
答案 0 :(得分:1)
创建的任何线程(无论是在DLL还是其他地方)都不会自动停止。特别是,创建线程的函数可能会返回。即使创建者线程退出,新线程仍将运行。也就是说,假设它没有达到其输入功能的结束。
Windows线程在准备好后返回DWORD。要查看,在线程句柄上调用WaitForSingleObject并使用0秒超时,并且成功,调用GetExitCodeThread。
我不了解你的整个“EFB”的东西,不论它是什么,也不是它的作用。如果它对正常的Windows线程做了有趣的事情,所有的赌注都会关闭。