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

时间:2017-09-28 04:00:25

标签: c# c++ multithreading c++-cli

我尝试编写一个与外部许可证系统对话的程序。该程序是许可证管理器,处理多个产品许可证。

对于许可证管理器检测到的每个安装的产品,它通过使用许可证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 个答案:

答案 0 :(得分:0)

您创建的每个线程都有自己的堆栈(默认为1 MB)和CPU寄存器的快照,一起调用上下文。 (有一些与线程关联的东西,比如TLS和公寓状态,但是让它保持简单)。 我假设您正在为Windows构建,但是对于任何线程抽象库都是如此,您可以继续使用。 Win32中的线程是通过调用CreateThreadEx创建的(参见MSDN),其中一个参数是入口点的地址,即所谓的ThreadProc,它将LPVOID作为参数,还有另一个LPVOID类型的参数叫做lParameter 。 现在,正如我上面所说,每个线程都有自己的堆栈。因此,如果要在它们之间共享数据,则需要将其存储在堆上。 创建指针指针(License ** pLicence)并将其作为lParameter传递。然后在ThreadProc中将LPVOID转换回指针并将其初始化为:* pLicence = oLicence.GetLicenceInfo(); 现在,您必须通知主线程后台线程已完成其工作。有很多方法可以做到这一点,比如PostMessage()