我尝试编写一个与外部许可证系统对话的程序。该程序是许可证管理器,处理多个产品许可证。
对于许可证管理器检测到的每个安装的产品,它通过使用许可证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调用。甚至可以这样做吗?
非常感谢任何见解或帮助。
答案 0 :(得分:0)
您创建的每个线程都有自己的堆栈(默认为1 MB)和CPU寄存器的快照,一起调用上下文。 (有一些与线程关联的东西,比如TLS和公寓状态,但是让它保持简单)。 我假设您正在为Windows构建,但是对于任何线程抽象库都是如此,您可以继续使用。 Win32中的线程是通过调用CreateThreadEx创建的(参见MSDN),其中一个参数是入口点的地址,即所谓的ThreadProc,它将LPVOID作为参数,还有另一个LPVOID类型的参数叫做lParameter 。 现在,正如我上面所说,每个线程都有自己的堆栈。因此,如果要在它们之间共享数据,则需要将其存储在堆上。 创建指针指针(License ** pLicence)并将其作为lParameter传递。然后在ThreadProc中将LPVOID转换回指针并将其初始化为:* pLicence = oLicence.GetLicenceInfo(); 现在,您必须通知主线程后台线程已完成其工作。有很多方法可以做到这一点,比如PostMessage()