使用线程控制访问外部API的对象



我试图编写与外部许可系统对话的程序。该计划是许可证经理,负责处理多个产品许可证。

对于安装了许可证经理检测到的每个产品,它通过使用许可证SDK进行API调用来初始化许可系统。

使用常规类很容易,因为我可以包装API并调用成员函数以初始化和完成。稍后,我可以根据需要检索有关许可证的更多信息,因为我正在使用已经通过API呼叫初始化许可证的类。当我关闭程序时,我会执行呼叫停止许可证并完成。

现在,我想做的是,对于每种产品及其许可证,我想创建一个线程来管理此包装器对象以执行API调用并与许可系统交谈。

以下是我想做的示例:

Class LicenseWraper
{
  LicenseWrapper()
  {
    // this is a C api call from the license SDK
    StartLicense();
  }
  
  ~licenseWrapper
  {
    // this is a C api call from the license SDK
    EndLicense();
  }
  
  string GetLicenseInfo()
  {
    // this is a C api call from the license SDK
    return GetLicenseInfoApi();
  }
}
void main()
{
  LicenseWraper oLicense = new LicenseWrapper();
  string sMyInfo = oLicense.GetLicenseInfo();
}

基于我对多线程的有限了解,我只能将功能传递给线程以完成工作并完成。如果我通过委托或专用函数在线程中创建licenseWrapper对象,那么它将确保创建对象并初始化许可证系统确定。

但是,现在初始化了许可证系统,我想通过oLicense.GetLicenseInfo()检索许可证信息。我的理解是,我无法从创建对象的线程中进行呼叫,因此oLicense.GetLicenseInfo()调用将无效,因为现在它是从外部线程调用的。

所以我的问题是:我如何使用线程来管理对象并保持该对象的活力,以便可以从该线程中进行API调用。甚至可以这样做吗?

任何洞察力或帮助都将不胜感激。

您创建的每个线程都有其自己的堆栈(默认为1 MB)和CPU寄存器的快照,称为上下文。(还有更多与线程相关的东西,例如TLS和公寓状态,但让它保持简单)。我认为您正在为Windows构建,但是对于任何线程抽象库都是正确的,您可以追随。Win32中的线程是用呼叫createThreadex创建的(请参阅MSDN),其中一个参数是入口点的地址,即所谓的ThreadProc,它将LPVoid作为参数,并且还有一个称为LPARameter的类型LPVoid的参数。现在,正如我上面说的那样,每个线程都有自己的堆栈。因此,如果您想共享它们之间的数据,则需要将其存储在堆上。创建指针指向指针(许可证** plicence),并将其作为lparameter传递。然后,在螺纹proc中,将lpVoid铸造回指针,然后像这样初始化它: *plicence = olicence.getlicenceinfo();现在,您必须通知主线程,背景线程已经完成了其作业。有很多方法可以做到这一点,例如postmessage()