BUG: Класс GlobalMultiUse не завершить в многопотоковой среде

ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.

Эта статья на английском языке:300850
Эта статья помещена в архив. Она предлагается "как есть" и обновляться не будет.
Проблема
Если два клиента вызов процедуры элемента ActiveX EXE-файла компонента, в то же время и эта процедура вызывает другую процедуру MultiUse класса ActiveX библиотеки динамической компоновки (DLL), если этот класс осуществляет доступ к процедуре в классе GlobalMultiUse в другую ActiveX DLL, исполняемые файлы ActiveX, компонент останется в памяти; т.е., процесс не смог завершить работу, даже после того как все ссылки на него были выпущены.

Данная проблема не возникает в Visual Basic 6.0 с пакетом обновления 3 (SP3) или более ранней версии.
Причина
Эта проблема возникает из-заDllCanUnloadNowфункции библиотеки DLL, GlobalMultiUse возвращает FALSE, если он в данный момент, вызывается другим потоком. Это означает, что GlobalMultiUse DLL не удается освободить себя в многопоточной среде.
Решение
Корпорация Майкрософт выпустила исправление, предназначенное только для устранения описанной в статье проблемы.. Предлагаемое исправление должно применяться исключительно в системах, где наблюдается описанная проблема..

Примечание.Необходимо иметь лицензионного соглашения Visual Studio для получения этого исправления.

Чтобы получить исправление и устранить проблему, свяжитесь со службами поддержки Майкрософт.. Полный список телефонов службы поддержки корпорации Майкрософт, а также сведения об условиях обслуживания см. на веб-узле Майкрософт по следующему адресу::Примечание.В отдельных случаях, если специалистом службы технической поддержки Майкрософт будет определено, что решением проблемы является специально выпущенное исправление, оплата, предусмотренная за обращение в службы технической поддержки, может быть отменена.. Дополнительные услуги по технической поддержке, не связанные с данным исправлением, оплачиваются на стандартных условиях..Английская версия данного исправления содержит версии файлов, приведенные в следующей таблице или более поздние.:
   Date         Time        Version    Size     File name      ---------------------------------------------------------   29 May 2001  3:32:23 PM  6.0.92.37  1.32 MB  Msvbvm60.dll				

Статус
Данное поведение является подтвержденной ошибкой продуктов Майкрософт, перечисленных в начале данной статьи..
Дополнительная информация

Действия по воспроизведению поведения

Создание библиотеки DLL с помощью класса GlobalMultiUse

  1. Создайте новый проект Библиотеки ActiveX с помощью класса по умолчанию класса Class1.
  2. ИзProjectвыберите пунктСвойства Проект1. Измените имя проекта дляGMultiUseDllи выберите командуOk..
  3. В диалоговом окнеСвойствадиалоговое окно поле, задайте свойство Instancing класса Class1 на6 GlobalMultiUse.
  4. Скопируйте и вставьте следующий код в модуль кода для класса Class1:
    Public Function ClassName() As String    ClassName = "Class1"End Function					
  5. ИзФайл:выберите пунктСделать GMultiUseDll.dllЧтобы скомпилировать проект. Создается GMultiUseDll.dll.

Создание библиотеки DLL с MultiUse классов

  1. Создайте новый проект Библиотеки ActiveX с помощью класса по умолчанию класса Class1.
  2. ИзProjectвыберите пунктСвойства Проект1. Измените имя проекта дляMultiUseDllи выберите командуOk..
  3. ИзProjectвыберите пунктСсылки, выберитеGMultiUseDll.dllи нажмите кнопкуOk..
  4. Скопируйте и вставьте следующий код в модуль кода для класса Class1:
    Public Function GetString() As String    GetString = ClassNameEnd Function					
  5. ИзФайл:выберите пунктСделать MultiUseDll.dllЧтобы скомпилировать проект. Создается MultiUseDll.dll.

Создание проекта ActiveX EXE-файла

  1. Создайте новый проект ActiveX EXE с помощью класса по умолчанию класса Class1.
  2. ИзProjectвыберите пунктСвойства Проект1. Измените имя проекта дляTestServerи выберите командуOk..
  3. ИзProjectвыберите пунктСсылки, выберитеMultiUseDll.dllи нажмите кнопкуOk..
  4. ИзProjectвыберите пунктСвойства TestServer. в менюОбщиевкладки, равным 10 потоков в пул потоков.
  5. Скопируйте и вставьте следующий код для класса Class1 на программный модуль
    Public Sub DoSomething()    Dim obj As MultiuseDll.Class1    Set obj = New MultiuseDll.Class1    obj.GetStringEnd Sub					
  6. ИзФайл:выберите пунктСделать TextServer.exeЧтобы скомпилировать проект. Создается TextServer.exe.

Создание проекта клиента

  1. Создайте новый проект стандартный EXE-файла в форме по умолчанию форма Form1.
  2. ИзProjectвыберите пунктСвойства Проект1. Измените имя проекта дляTestClientи выберите командуOk..
  3. Добавьте в форму Form1 (Label1) Label, TextBox (Текст1) и два CommandButtons (Command1 и Command2).
  4. Скопируйте и вставьте следующий код в модуль кода для формы 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. ИзФайл:выберите пунктСделать TestClient.exeЧтобы скомпилировать проект. Создается TestClient.exe.

Выполнение теста

  1. Откройте программу «Блокнот». Добавить букву «t», в первую позицию и сохраните файл как Sync.txt в корневой каталог диска C.
  2. Запустите два экземпляра TestClient.exe. Обратите внимание, что два процесса TestClient.exe работают в диспетчере задач.
  3. затем –START ::для обоих экземпляров TestClient.
  4. Откройте Sync.txt. Изменить первую строку "true" и сохранить.

    После сохранения файла, обратите внимание, TestServer.exe процесса в диспетчере задач.
  5. затем –Сообщение об ошибке «Stop:для обоих экземпляров TestClient и закрытия формы. Обратите внимание на то нет экземпляров TestClient.exe работы. В данный момент TestServer.exe остается загрузки.
За дополнительной информацией о проблемах, связанных с многопоточностью в Visual Basic, щелкните следующий номер статьи базы знаний Майкрософт:
241896Проблема: Threading проблемы с компонентами ActiveX Visual Basic 6.0
MULTI-Thread

Внимание! Эта статья переведена автоматически

Свойства

Номер статьи: 300850 — последний просмотр: 02/21/2014 00:43:11 — редакция: 2.0

Microsoft Visual Basic 6.0 Professional Edition

  • kbnosurvey kbarchive kbbug kblocalsvr kbpending kbqfe kbmt KB300850 KbMtru
Отзывы и предложения