Erro: Não terminar GlobalMultiUse classe num ambiente multithreaded

Traduções de Artigos Traduções de Artigos
Artigo: 300850 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando dois clientes chamar um procedimento de um EXE ActiveX componente ao mesmo tempo e este procedimento chama outro procedimento de uma classe MultiUse numa biblioteca de ligação dinâmica (DLL), se aceder a esta classe um procedimento numa classe GlobalMultiUse na outra DLL de ActiveX, um EXE ActiveX componente permanece ActiveX na memória; o que é, o processo não conseguir terminar, mesmo depois de todas as referências foram lançadas.

Este comportamento não ocorre no Visual Basic 6.0 Service Pack 3 (SP3) ou anterior.

Causa

Este problema ocorre porque a função DllCanUnloadNow da DLL GlobalMultiUse devolve FALSO se está actualmente a ser chamado por outro thread. Isto significa que a DLL GlobalMultiUse pode não ser conseguir libertar-se num ambiente com vários threads.

Resolução

Agora é disponibilizada pela Microsoft uma correcção suportada, mas destina-se apenas a corrigir o problema descrito neste artigo. Aplique-a apenas em sistemas que tenham este problema específico.

Nota Tem de ter um contrato de licença Visual Studio para obter este hotfix.

Para resolver este problema, contacte o suporte técnico da Microsoft para obter a correcção. Para obter uma lista completa de números de telefone do suporte técnico da Microsoft e informações sobre os custos de suporte, visite o seguinte Web site da Microsoft:
http://support.microsoft.com/contactus/?ws=support
Nota Em casos especiais, os custos normalmente inerentes às chamadas de suporte poderão ser anulados, se um técnico de suporte da Microsoft determinar que uma actualização específica resolverá o problema. Os custos normais do suporte serão aplicados a problemas adicionais e questões de suporte que não se enquadrem na atualização específica em questão. A versão inglesa desta correcção deverá ter os seguintes atributos de ficheiro ou posteriores:
   Date         Time        Version    Size     File name   
   ---------------------------------------------------------
   29 May 2001  3:32:23 PM  6.0.92.37  1.32 MB  Msvbvm60.dll
				

Ponto Da Situação

A Microsoft confirmou que este é um erro no Microsoft produtos listados no início deste artigo.

Mais Informação

Passos para reproduzir o comportamento

Criar a DLL com uma classe GlobalMultiUse

  1. Crie um novo projecto ActiveX DLL com uma classe predefinida, Aula1.
  2. No menu Project , clique em Propriedades do projeto1 . Altere o nome do projecto para GMultiUseDll e, em seguida, clique em OK .
  3. Na caixa de diálogo Propriedades , defina a propriedade Instancing de Aula1 para 6 - GlobalMultiUse .
  4. Copie e cole o seguinte código para o módulo de código do Aula1:
    Public Function ClassName() As String
        ClassName = "Class1"
    End Function
    					
  5. No menu ficheiro , clique em Criar GMultiUseDll.dll para compilar o projecto. GMultiUseDll.dll é criado.

Criar a DLL com uma classe MultiUse

  1. Crie um novo projecto ActiveX DLL com uma classe predefinida, Aula1.
  2. No menu Project , clique em Propriedades do projeto1 . Altere o nome do projecto para MultiUseDll e, em seguida, clique em OK .
  3. No menu Project , clique em References , seleccione a caixa de verificação GMultiUseDll.dll e, em seguida, clique em OK .
  4. Copie e cole o seguinte código para o módulo de código do Aula1:
    Public Function GetString() As String
        GetString = ClassName
    End Function
    					
  5. No menu ficheiro , clique em Criar MultiUseDll.dll para compilar o projecto. MultiUseDll.dll é criado.

Criar projecto EXE ActiveX

  1. Crie um novo projecto EXE ActiveX com uma classe predefinida, Aula1.
  2. No menu Project , clique em Propriedades do projeto1 . Altere o nome do projecto para TestServer e, em seguida, clique em OK .
  3. No menu Project , clique em References , seleccione a caixa de verificação MultiUseDll.dll e, em seguida, clique em OK .
  4. No menu Project , clique em Propriedades TestServer . No separador Geral , defina o conjunto de threads a 10 threads.
  5. Copie e cole o seguinte código para o módulo de código do Aula1
    Public Sub DoSomething()
        Dim obj As MultiuseDll.Class1
        Set obj = New MultiuseDll.Class1
        obj.GetString
    End Sub
    					
  6. No menu ficheiro , clique em Criar TextServer.exe para compilar o projecto. TextServer.exe é criado.

Criar o projecto de cliente

  1. Crie um novo projecto EXE padrão com um formulário predefinido, Form1.
  2. No menu Project , clique em Propriedades do projeto1 . Altere o nome do projecto para TestClient e, em seguida, clique em OK .
  3. Adicione dois CommandButtons (Command1 e Command2) de uma etiqueta (Rótulo1) e uma caixa de texto (Texto1) ao Form1.
  4. Copie e cole o seguinte código para o módulo de código do Form1:
    Dim bStop As Boolean
    
    Private Sub Command1_Click()
        Dim oServer As Object
        Set oServer = CreateObject("TestServer.Class1")
        WaitTRUEinFile Text1.Text
        oServer.DoSomething
        Set oServer = Nothing
        Label1.Caption = "The reference was released"
    End Sub
    
    ' The purpose of this function is to synchronize the call to the
    ' GlobalMultiUse DLL through the file Sync.txt.
    Private Sub WaitTRUEinFile(sFile As String)
        Dim sFlag      As String
        Label1.Caption = "Waiting for 'TRUE' in " & sFile
        Do While bStop = False
            Open sFile For Input As #1
            Line Input #1, sFlag
            Close #1
            
            If UCase(Trim(sFlag)) = "TRUE" Then
                Exit Do
            End If
            DoEvents
        Loop
    End Sub
    
    Private Sub Command2_Click()
        bStop = True
    End Sub
    
    Private Sub Form_Load()
        Text1.Text = "c:\sync.txt"
        Command1.Caption = "Start"
        Command2.Caption = "Stop"
        bStop = False
    End Sub
    
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        bStop = True
    End Sub
    					
  5. No menu ficheiro , clique em Criar TestClient.exe para compilar o projecto. TestClient.exe é criado.

Executar o teste

  1. Abra o bloco de notas. Adicionar a letra "t" para a primeira posição e guarde o ficheiro como Sync.txt na raiz da unidade C.
  2. Inicie duas instâncias de TestClient.exe. Repare que dois processos TestClient.exe estão em execução no Gestor de tarefas.
  3. Clique em Iniciar para ambas as instâncias do TestClient.
  4. Abra Sync.txt. Alterar a primeira linha como "true" e guardar.

    Depois de guardar o ficheiro, repare o processo de TestServer.exe no Gestor de tarefas.
  5. Clique em Parar para ambas as instâncias do TestClient e feche os formulários. Repare que existem sem instâncias do TestClient.exe abertas. Neste ponto, TestServer.exe permanece carregado.
Para obter informações adicionais sobre problemas relacionados com a multithread no Visual Basic, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
241896PROBLEMA: Threading problemas com componentes de ActiveX do Visual Basic 6.0

Propriedades

Artigo: 300850 - Última revisão: 24 de fevereiro de 2014 - Revisão: 4.2
A informação contida neste artigo aplica-se a:
  • Microsoft Visual Studio 6.0 Service Pack 4
  • Microsoft Visual Studio 6.0 Service Pack 5
  • Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 4
  • Microsoft Visual Basic 6.0 Enterprise Edition Service Pack 5
  • Microsoft Visual Basic 6.0 Professional Edition
Palavras-chave: 
kbnosurvey kbarchive kbmt kbbug kblocalsvr kbpending kbqfe KB300850 KbMtpt
Traduçã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: 300850

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