Problémy s součásti ActiveX 6.0 jazyka threading

Překlady článku Překlady článku
ID článku: 241896 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Při použití součásti ActiveX 6.0 jazyka v prostředí s více podprocesy by měla být vědoma následující potenciální problémy:

ActiveX DLL hostitelem v víceprocesový klienta

  • Porušení přístupu uvnitř MSVBVM60.DLL
  • Klient zadá zablokování stavu.
Tyto dva příznaky se může zobrazit, pokud ActiveX DLL jazyka hostitelem v víceprocesový prostředí, například IIS, MTS nebo víceprocesový klienta a není povolena možnost Zachovat V paměti. Tuto možnost povolit, postupujte následujícím způsobem:
  1. V nabídce projekt vyberte Vlastnosti projektu.
  2. Na kartě Obecné zkontrolujte, zda je threading model podprocesem Apartment poté Unattended Execution a Zachovat In Memory zaškrtávacích políček vyberte *.
  3. Uložte projekt a kompilovat DLL.
* Poznámka:Bezobslužné spuštění možnost není k dispozici, pokud projekt obsahuje všechny prvky uživatelského rozhraní, například formuláře nebo ovládací prvky. Možnost Zachovat V paměti není k dispozici, pokud není vybrána Unattended Execution.

Poznámka: Před na aktualizaci Service Pack 3 pro Visual Studio 6.0 bylo možné získat AV během procesu vypnutí s Doba uchování paměti povoleno. Byl vyřešen v nejnovější aktualizaci service pack pro aplikaci Visual Studio 6.0:
http://msdn2.microsoft.com/en-us/vstudio/aa718364.aspx'

Pokud projekt ActiveX DLL nebo UserControl obsahuje deklarace API, může dojít k zablokování během proces nebo podproces vypnutí nebo vytvoření objektu, i v případě, že má políčko Unattended Execution byly vybrány z ActiveX DLL. K řešení tohoto problému můžete použít knihovny typů namísto Declare v jazyka. Další informace o použití knihovny typů klepněte na číslo článku níže % 2 % 2 článku databáze Microsoft Knowledge Base:
189133Postupy: Vytvoření další usnadněním VB s knihovnou typů C DLL

ActiveX EXE přistupovat víceprocesový klientem nebo více threaded jednoho nebo multi klientů

Chyba Runtime '7: Nedostatek paměti a někdy následovaný Chyba operace disku.
Chyba při spuštění '430: Třída nepodporuje automatizaci nebo nepodporuje očekávané rozhraní.
Chyba při spuštění '424: požadovaných objektů.
Chyba při spuštění '-2147023170 (800706be): Chyba automatizace. Volání vzdálené procedury se nezdařilo.
Chyba při spuštění '-2147287010 (8003001e): Chyba automatizace. Toto je základě "ke chybě disku došlo k během čtení operaci." ErrLook.
Další server procesy (ThreadTest.EXE) jsou vytvořeny, i když vlastnost Instancing Class1 označeny MultiUse.
Může se zobrazit chybové zprávy uvedené výše, pokud máte server ActiveX EXE s fondu podprocesů větší než jedna (1) a víceprocesový klienta nebo více threaded jednoho nebo multi klientů rychlému vytváření a zničení objekty uvnitř serveru. Tento problém vyřešit v místním serveru vytvořit prázdný třídy a mít klienta odkaz jej zachovat, jak je uvedeno v části "Další informace".

Prohlášení

Toto chování je záměrné.Visual Studio 6 Service Pack 5, pokud projekt obsahuje libovolné veřejné třídy, které má MTSTransactionMode nastaveno na nic jiného než 0, možnost Spuštění bezobslužné a Zachovat V paměti jsou automaticky vybrána možnost.

Další informace

Kroky pro reprodukci tohoto chování

A: vytváření serveru

  1. Vytvoření projektu ActiveX EXE a přejmenovat ThreadTest.
  2. Z nabídce projekt vyberte Vlastnosti projektu a na kartě Obecné vyberte z Fondu podprocesů dvě (2).
  3. Výchozí třída (Class1) přidejte následující kód:
    Private strClassName As String
    Public Property Let ClassName(ByVal vData As String)
       strClassName = vData
    End Property
    Public Property Get ClassName() As String
       ClassName = strClassName 
    End Property
    					
  4. Uložte a zkompilujte projekt (ThreadTest.EXE)

B: Vytvoření klienta a testování

  1. Spuštění projektu standardní EXE a přejmenujte jej na klienta.
  2. Přidat příkazové tlačítko a textové pole výchozí formulář (Form1).
  3. Přidejte následující kód Form1:
    Private Sub Command1_Click()
       Dim i As Long, j As Long
       Dim o As Object
       j = Val(Text1.Text)
       For i = 1 To j
          DoEvents
          Set o = CreateObject("ThreadTest.Class1")
          o.ClassName = i
          Me.Caption = o.ClassName
          Set o = Nothing
       Next
    End Sub
    Private Sub Form_Load()
       Text1.Text = 1000
       Command1.Caption = "Start"
    End Sub
    					
  4. Kompilovat projektu (Client.EXE)
  5. Spusťte tři nebo více instancí Client.EXE a stiskněte tlačítko Start na každý formulář. Poznámka: viz jeden nebo více výše uvedených chybových zpráv.

C: implementaci řešení

  1. Otevřete projekt ThreadTest.
  2. Přidat jiný modul třídy (Přednáška2) s žádný kód.
  3. Uložit a re-compile projektu (ThreadTest.EXE)
  4. Otevřete projekt klienta.
  5. Nahraďte následující kód v Form1:
    Private p As Object
    Private Sub Command1_Click()
       Dim i As Long, j As Long
       Dim o As Object
       j = Val(Text1.Text)
       For i = 1 To j
          DoEvents
          Set o = CreateObject("ThreadTest.Class1")
          o.ClassName = i
          Me.Caption = o.ClassName
          Set o = Nothing
       Next
    End Sub
    Private Sub Form_Load()
       Text1.Text = 1000
       Command1.Caption = "Start"   
       Set p = CreateObject("ThreadTest.Class2")
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
       Set p = Nothing
    End Sub
    					
  6. Uložit a re-compile projektu (Client.EXE)
  7. Spustit tři nebo více instancí Client.EXE a stiskněte tlačítko Start na každý formulář. Poznámka: měli byste vidět žádné chybové zprávy.
Při přístupu ActiveX EXE s fondu podprocesů větší než jedna podle více klientům prostřednictvím DCOM řešení popsané v části "Další informace" součást C nefunguje. Proto, Visual Basic 6.0 ActiveX EXE servery nejsou vhodné pro DCOM servery s více klientů rychlému vytváření a zničení objekty. Pokud serverová aplikace musí zpracovat tento scénář, důrazně doporučujeme používat ActiveX DLL v MTS místo. Při navrhování ActiveX DLL k hostovat MTS by měl provést jisti, že Unattended Execution a Zachovat In Memory zaškrtávací políčka jsou zaškrtnuta obě. Tyto zaškrtávacích políček a umístěn v nabídce projekt vyberte Vlastnosti a vyberete kartu Obecné.

Nepoužívejte vlastnost Instancing GlobalMultiUse pro třídu, pokud máte v úmyslu použít součást ActiveX pod MTS nebo COM +. Rozhraní objektu GlobalMultiUse je v mezipaměti za tabulku podle podprocesu a není uvolněno, dokud ukončí podproces. Výsledkem je Pokud volání pochází v s jiný kontext (ačkoli ve stejném podprocesu), se nezdaří s RPC_E_WRONG_THREAD. Použití součásti v MTS a COM + byste navrhnout tříd způsobem objekty jsou nestavové.

Vlastnosti

ID článku: 241896 - Poslední aktualizace: 7. srpna 2007 - Revize: 5.2
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Visual Studio 6.0 Service Pack 3
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
Klíčová slova: 
kbmt kbprb kbthread kbtophit KB241896 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:241896

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com