Artigo: 241896 - Última revisão: terça-feira, 7 de Agosto de 2007 - Revisão: 5.2

Problemas com componentes do Visual Basic 6.0 ActiveX de thread

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

Ao utilizar componentes do Visual Basic 6.0 ActiveX num ambiente multi-threaded, deve ter em atenção os seguintes problemas potenciais:

DLL de ActiveX hospedados num cliente multi-threaded

  • Violação de acesso dentro MSVBVM60.DLL.
  • Cliente entra num estado de impasse.
Poderá ver estes dois sintomas se uma DLL de ActiveX do Visual Basic hospedada num ambiente multi-threaded, por exemplo, IIS, MTS ou um cliente multi-threaded, e a opção de Manter na memória não está activada. Para activar esta opção, siga os passos abaixo:
  1. Menu projecto , seleccione Propriedades do projecto .
  2. No separador Geral , garantir que o modelo de threading está apartamento com e seleccione as caixas de verificação Execução automática e Reter na memória * .
  3. Guardar o projecto e compilar a DLL.
* Nota A opção de Execução automática não está disponível se o projecto contém quaisquer elementos de interface de utilizador, tais como formulários ou controlos. A opção de Manter na memória não está disponível se a Execução automática não estiver seleccionada.

Nota Anterior ao Service Pack 3 para Visual Studio 6.0, foi possível obter um AV durante o processo de encerramento com reter na memória activada. Foi corrigido no service pack mais recente do Visual Studio 6.0:
http://msdn2.microsoft.com/en-us/vstudio/aa718364.aspx' (http://msdn2.microsoft.com/en-us/vstudio/aa718364.aspx)

Se um projecto de DLL de ActiveX ou UserControl contém declarações de API, poderá detectar bloqueios fatais durante o processo/thread encerrar ou a criação de objectos, mesmo que a caixa de verificação de Execução automática tem sido seleccionado no caso de uma DLL de ActiveX. Para contornar este problema, pode utilizar uma biblioteca de tipos em vez de Declare no Visual Basic. Para obter informações adicionais sobre como utilizar uma biblioteca de tipos, clique o número de artigo % 2 abaixo para visualizar o artigo % 2 na base de dados de conhecimento da Microsoft:
189133  (http://support.microsoft.com/kb/189133/EN-US/ ) COMO: Criar C DLL mais acessíveis para VB com uma biblioteca de tipos

EXE ActiveX acedidos por um cliente multi-threaded ou por vários único ou multi-threaded clientes

Erro de tempo de execução '7': memória esgotada e por vezes seguido de um erro de operação do disco.
Run-time error '430': classe não suporta automatização ou não suporta a interface esperada.
Run-time error '424': objecto necessário.
Run-time error '-2147023170 (800706be)': erro de automatização. A chamada de procedimento remoto falhou.
Run-time error '-2147287010 (8003001e)': erro de automatização. Esta é uma "Ocorreu um erro de disco durante uma operação de leitura." baseia ErrLook.
Processos de servidor adicional (ThreadTest.EXE) são criados, mesmo que a propriedade Instancing Aula1 está marcado como MultiUse.
Poderá ver mensagens de erro listadas acima, se tiver um servidor EXE ActiveX com um conjunto de threads maior do que um (1) e um cliente multi-threaded ou vários único ou multi-threaded clientes criar rapidamente e destruir objectos dentro do servidor. Para contornar este problema, pode criar uma classe vazio no servidor local e tiver o cliente manter uma referência à mesma tal como apresentado na secção "Mais informação" abaixo.

Ponto Da Situação

Este comportamento ocorre por predefinição.No Visual Studio 6 Service Pack 5, se um projecto contiver qualquer classe pública que tenha MTSTransactionMode conjunto para algo diferente de 0 , a opção de Execução automática e a Manter na memória são automaticamente seleccionada.

Mais Informação

Passos para reproduzir o comportamento

O servidor de criação de A:

  1. Criar um projecto EXE ActiveX e mude o nome ThreadTest .
  2. Menu Project , seleccione Propriedades do projecto e no separador Geral , seleccione um Conjunto de threads de dois (2).
  3. Adicione o seguinte código à classe predefinida (Aula1):
    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. Guarde e compilar o projecto (ThreadTest.EXE).

B: criar o cliente e de teste

  1. Inicie um projecto EXE padrão e mude o nome do mesmo cliente .
  2. Adicione um botão de comando e uma caixa de texto para o formulário predefinido (Form1).
  3. Adicione o seguinte código ao 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. Compile o projecto (Client.EXE).
  5. Iniciar três ou mais instâncias de Client.EXE e prima o botão Iniciar em cada formulário. Tenha em atenção que pode ver um ou mais das mensagens de erro acima.

C: implementar a solução alternativa

  1. Abra o projecto ThreadTest.
  2. Adicione outro módulo de classe (Aula2) com não código.
  3. Guarde e re-compile o projecto (ThreadTest.EXE).
  4. Abra o projecto de cliente.
  5. Substitua o código de Form1 com o seguinte:
    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. Guarde e re-compile o projecto (Client.EXE).
  7. Executar três ou mais instâncias de Client.EXE e prima o botão Iniciar em cada formulário. Tenha em atenção que deverá ver sem mensagens de erro.
Quando um EXE ActiveX com um conjunto de threads maior do que um é acedido por vários clientes através de DCOM, a solução descrita parte C da secção "Mais informação" não funciona. Servidores de Visual Basic 6.0 ActiveX EXE consequence, não são adequados para servidores DCOM com vários clientes criar rapidamente e destruir objectos. Se a aplicação de servidor necessitar de gerir este cenário, recomenda-se que utilize ActiveX dll no MTS em vez disso. Ao estruturar as DLL de ActiveX ser hospedado no MTS, deverá certificar-se de que as caixas de verificação Execução automática e Reter na memória estão ambas seleccionadas. Estas caixas de verificação e localizada no menu Project , quando escolhe Propriedades e, seleccione o separador Geral .

Não utilize a propriedade GlobalMultiUse instância de uma classe se tenciona utilizar o componente ActiveX em MTS ou +. A interface para o objecto GlobalMultiUse está em cache num por tabela baseada em thread e não é libertada até que o thread termina. Como resultado, se uma chamada vem com um contexto diferente (embora no mesmo thread), falhar com RPC_E_WRONG_THREAD. Para utilizar componentes no MTS e COM +, deve estruturar as classes de tal forma que os objectos são sem estado.

A informação contida neste artigo aplica-se a:
  • 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
Palavras-chave: 
kbmt kbprb kbthread kbtophit KB241896 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 241896  (http://support.microsoft.com/kb/241896/en-us/ )