Freigeben über


Verwalten von Threadverweisen

Dieser Artikel enthält Informationen zur Verwaltung von Threadverweisen mithilfe von Funktionen aus den Funktionen des Einfachen Shell-Hilfsprogramms.

Situationen treten auf, wenn ein übergeordneter Thread für die Lebensdauer eines untergeordneten Threads aktiv gehalten werden muss. Wenn instance ein COM-Objekt (Component Object Model) im übergeordneten Thread erstellt und in den untergeordneten Thread gemarshallt wird, kann dieser übergeordnete Thread nicht vor dem untergeordneten Thread beendet werden. Um dies zu erreichen, stellt die Shell diese Funktionen bereit.

Verwenden Sie diese Funktionen in Ihrem übergeordneten Thread, wie hier beschrieben.

  1. Deklarieren Sie eine anwendungsdefinierte Threadprozedur, die der Form der ThreadProc-Funktion folgt.

    DWORD WINAPI ThreadProc(LPVOID lpParameter);
    
  2. Rufen Sie in ThreadProcSHCreateThreadRef auf, um einen Verweis auf den Thread zu erstellen. Dies stellt einen Zeiger auf eine instance von IUnknown bereit. Diese IUnknown verwendet den Wert, auf den pcRef verweist, um eine Verweisanzahl beizubehalten. Solange diese Anzahl größer als 0 ist, bleibt der Thread aktiv.

  3. Rufen Sie mit diesem Zeiger auf IUnknownSHSetThreadRef in ThreadProc auf. Dadurch wird der Verweis so festgelegt, dass nachfolgende Aufrufe von SHGetThreadRef etwas abrufen können.

  4. Wenn Ihre ThreadProc einen weiteren Thread erstellt, kann ThreadProc dieses Threads SHGetThreadRef mit dem Zeiger auf IUnknown aufrufen, der von SHCreateThreadRef abgerufen wurde. Dadurch wird die Verweisanzahl erhöht, auf die der pcRef-Parameter in SHCreateThreadRef verweist.

  5. Erstellen Sie den Thread. Dies erfolgt in der Regel durch Aufrufen von SHCreateThread, wobei im PfnThreadProc-Parameter ein Zeiger auf Ihre ThreadProc-Datei übergeben wird. Übergeben Sie außerdem das flag CTF_THREAD_REF im dwFlags-Parameter . Der Thread ist aktiv, solange ThreadProc ausgeführt wird.

  6. Wenn ein untergeordneter Thread erstellt wird, übergeben Sie das flag CTF_REF_COUNTED im dwFlags-Parameter im Aufruf des shCreateThread-Elements.

  7. Wenn untergeordnete Threads abgeschlossen und freigegeben werden, nimmt der Wert ab, auf den der pcRef des übergeordneten Threads verweist. Sobald alle untergeordneten Threads abgeschlossen sind, kann die ursprüngliche ThreadProc abschließen und den endgültigen Threadverweis freigeben, wodurch die Verweisanzahl auf 0 fällt. An diesem Punkt wird der Verweis auf den ursprünglichen Thread freigegeben, der von SHCreateThread geöffnet wurde, und der Thread wurde abgeschlossen.

Eine weitere verwandte Funktion ist SHReleaseThreadRef. Diese Funktion wird von ThreadProc aufgerufen, wenn der Thread mithilfe von SHCreateThread mit dem flag CTF_THREAD_REF erstellt wurde. Die ThreadProc muss dies jedoch nicht implizit tun. Der Aufruf von IUnknown::Release für den Zeiger auf IUnknown , der über SHCreateThreadRef abgerufen wurde, ist alles, was getan werden muss.