Erro: Não terminar GlobalMultiUse classe num ambiente multithreaded

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
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
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: 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 = ClassNameEnd 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.GetStringEnd 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 BooleanPrivate 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    LoopEnd SubPrivate Sub Command2_Click()    bStop = TrueEnd SubPrivate Sub Form_Load()    Text1.Text = "c:\sync.txt"    Command1.Caption = "Start"    Command2.Caption = "Stop"    bStop = FalseEnd SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)    bStop = TrueEnd 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
multi-thread

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 300850 - Última Revisão: 02/24/2014 15:34:13 - Revisão: 4.2

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

  • kbnosurvey kbarchive kbmt kbbug kblocalsvr kbpending kbqfe KB300850 KbMtpt
Comentários