线程中的DLL,其中DLL必须在子线程完成之前返回

时间:2009-03-09 13:09:53

标签: c++ multithreading dll

我正在编写一个包装器DLL,用于将横河电机WT1600功率计的通信DLL连接到基于PC的自动化软件包。我让通信部分工作,但我需要对其进行处理,以便可以保持自动化程序包的50ms扫描时间。 (扩展功能块(EFB)调用将阻止扫描,直到它返回)

这些是我需要做的步骤。

  1. 致电EFB
  2. EFB创建一个线程来执行通信设置(大约需要200ms)
  3. 当线程正在执行工作时,EFB返回EFB_BUSY
    • 3A。 (自动化程序继续扫描,直到它回到EFB呼叫)
  4. 调用EFB传递,使其在最后一次通话中恢复正常
  5. EFB检查线程是否已返回
  6. 如果线程返回则EFB返回成功,Else返回EFB_BUSY
  7. 重复3a-6直到efb返回成功
  8. 所以我的问题是,如何创建一个在调用函数的生命周期之后存在的线程?当我回调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中的示例代码作为我的模型。

1 个答案:

答案 0 :(得分:1)

创建的任何线程(无论是在DLL还是其他地方)都不会自动停止。特别是,创建线程的函数可能会返回。即使创建者线程退出,新线程仍将运行。也就是说,假设它没有达到其输入功能的结束。

Windows线程在准备好后返回DWORD。要查看,在线程句柄上调用WaitForSingleObject并使用0秒超时,并且成功,调用GetExitCodeThread。

我不了解你的整个“EFB”的东西,不论它是什么,也不是它的作用。如果它对正常的Windows线程做了有趣的事情,所有的赌注都会关闭。