代码之家  ›  专栏  ›  技术社区  ›  Tanj

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

  •  0
  • Tanj  · 技术社区  · 17 年前

    我正在编写一个包装器DLL,将横河WT1600功率表的通信DLL接口到一个基于PC的自动化软件包。我让通信部分工作了,但我需要将其线程化,这样就可以维护自动化包的50毫秒扫描时间。(扩展功能块(EFB)调用将阻止扫描,直到扫描返回)

    这些是我需要做的步骤。

    1. 呼叫EFB
    2. EFB创建执行通信设置的线程(大约需要200毫秒)
    3. 当线程执行工作时,efb返回efb_busy
      • 3a.(自动程序继续扫描,直到返回到EFB调用)
    4. 呼叫EFB传入,它在最后一次呼叫时返回忙碌状态
    5. EFB检查线程是否返回
    6. 如果线程返回,那么EFB返回SUCCESS,否则返回EFB\U BUSY
    7. 重复3a-6,直到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页

    我通过为互斥体和线程创建一个全局句柄来实现它。初始化初始化入口点中的互斥体(在加载dll时完成),并在实际调用dll时在主函数中创建线程。

    我使用的示例代码来自 MSDN: Creating Threads 作为我的模型。

    1 回复  |  直到 13 年前
        1
  •  1
  •   MSalters    17 年前

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

    Windows线程在准备就绪时返回一个双字。要查看,请在线程句柄上调用waitForSingleObject,超时时间为0秒,如果成功,则调用getExitCodeThread。

    我不明白你的整个“EFB”的事情,不管是什么,也不知道它做了什么。如果它对普通的Windows线程做了一些有趣的事情,那么所有的赌注都取消了。