2017-09-28 9 views
0

外部ライセンスシステムと通信するプログラムを作成しようとしています。このプログラムは、ライセンスマネージャーであり、いくつかの製品ライセンスを処理します。スレッドを使用して外部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呼び出しを行うことができるようにそのオブジェクトを生かしておくにはどうすればよいですか?これも可能ですか?

洞察や助けをいただければ幸いです。

+0

それをグローバル変数にするだけで、1人のライセンスプロバイダですべての人に十分です。 –

+0

@HansPassantコメントをいただきありがとうございますが、グローバルライセンスを取得したことが何を意味するのかよく分かりませんでした。あなたは例を挙げることができますか? –

答えて

0

作成する各スレッドには、独自のスタック(デフォルトでは1 MB)とCPUレジスタのスナップショット(コンテキストを合わせて)があります。 (TLSやアパートのようなスレッドに関連するものがたくさんありますが、それを簡単に保つことができます)。 私はあなたがWindows用に構築していると仮定していますが、次のことはスレッド抽象ライブラリの場合に当てはまります。 Win32のスレッドはCreateThreadEx(MSDNを参照)を呼び出して作成され、パラメータの1つはエントリポイントのアドレス、いわゆるThreadProcで、パラメータとしてLPVOIDをとり、lParameterというLPVOIDタイプの別のパラメータがあります。 上記のように、各スレッドは独自のスタックを取得します。したがって、それらの間でデータを共有する場合は、ヒープに格納する必要があります。 ポインタ(License ** pLicence)へのポインタを作成し、lParameterとして渡します。次に、ThreadProcでLPVOIDをポインタにキャストし、そのように初期化します。* pLicence = oLicence.GetLicenceInfo(); これで、バックグラウンドスレッドがそのジョブを完了したことをメインスレッドに通知する必要があります。

関連する問題