Makale numarası: 241896 - Son Gözden Geçirme: 07 Ağustos 2007 Salı - Gözden geçirme: 5.2

Visual Basic 6.0 ActiveX bileşenleri ile ilgili sorunlar için iş parçacığı

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Belirtiler

Visual Basic 6.0 ActiveX bileşenleri için bir çok iş parçacıklı ortamda kullanırken, aşağıdaki olası sorunları bilmelisiniz:

Çok iş parçacığından oluşan bir istemcinin, ActiveX DLL barındırılan

  • MSVBVM60.DLL içinde erişim ihlali oluşuyor.
  • Istemci, bir kilitlenme durumuna girer.
Bir çok iş parçacıklı ortamda, örneğin, IIS, MTS veya bir çok iş parçacıklı istemci bulunan bir Visual Basic ActiveX DLL DOSYASı ve Bellek gelen Koru</a0> seçeneği etkin değildir, bu iki belirtileri görebilirsiniz. Bu seçeneği etkinleştirmek için aşağıdaki adımları izleyin:
  1. Proje menüsünde Proje Özellikleri seçin.
  2. Genel sekmesinde, iş parçacığı modeli grubu akıtılan olduğundan emin olun, sonra Katılımsız yürütme ve Bellek gelen Koru onay kutularını seçin *.
  3. Projeyi kaydedin ve DLL DOSYASıNı derleyin.
* Not Proje Formları veya denetimler gibi bir kullanıcı arabirimi öğeleri içeriyorsa, Katılımsız yürütme seçeneği kullanılamaz. Katılımsız yürütme seçili değilse, Gelen bellek Koru</a0> seçeneği kullanılamaz.

Not Visual Studio 6.0 Service Pack 3 için önce bellekteki etkin tut'ile işlem kapatma sırasında bir AV alma olasılığı oldu. Bu, en son Visual Studio 6.0 hizmet paketinde giderilmiştir:
http://msdn2.microsoft.com/en-us/vstudio/aa718364.aspx' (http://msdn2.microsoft.com/en-us/vstudio/aa718364.aspx)

Söz konusu olduğunda, ActiveX DLL DOSYASı, ActiveX DLL veya UserControl projesinde API bildirimleri içerir, kilitlenmeleri işlem/iş parçacığı kapatma sırasında karşılaşabileceğiniz veya nesne oluşturma, bile Katılımsız yürütme</a0> onay kutusunu seçilmiş. Geçici çözüm bu sorun, bir tür kitaplığı içinde Declare yerine kullanabileceğiniz Visual Basic. Bir tür kitaplığı'nı kullanma hakkında ek bilgi için Microsoft Knowledge Base'deki makaleyi % 2'ni görüntülemek üzere aşağıdaki makale numarasını tıklatın % 2'yi tıklatın:
189133  (http://support.microsoft.com/kb/189133/EN-US/ ) Nasıl YAPıLıR: <a1>C</a1> DLL VB ile bir tür kitaplığı için daha erişilebilir yapma

ActiveX EXE çok iş parçacığından oluşan bir istemci veya birden çok tek veya çok threaded istemciler tarafından erişilebilir.

Çalışma zamanı hatası '7': bellek yetersiz ve bazen bir disk işlemi hatası izler.
Çalışma zamanı hatası '430': sınıf Otomasyonu desteklemiyor ya da beklenen arabirimi desteklemiyor.
'424' Çalışma zamanı hatası: nesne, gerekli.
Çalışma zamanı hatası '-2147023170 (800706be)': Otomasyon hatası. Uzak yordam çağrısı başarısız oldu.
Çalışma zamanı hatası '-2147287010 (8003001e)': Otomasyon hatası. Bu, bir "disk bir hata bir okuma işlemi. sırasında oluştu" ErrLook üzerinde temel alan.
Class1 Instancing özelliğini MultiUse işaretlenmiş olsa bile, ek sunucu işlemleri (ThreadTest.EXE) oluşturulur.
Bir ActiveX EXE sunucusu değerinden bir (1), çok iş parçacığından oluşan bir istemci veya hızla oluşturma ve sunucu içindeki nesneleri yok edilmesi birden çok tek veya çok threaded istemcilerinin bir iş parçacığı havuzu varsa, yukarıda listelenen hata iletilerini görebilirsiniz. Bu soruna geçici bir çözüm bulmak için <a0></a0>, yerel sunucu boş bir sınıf oluşturmak ve bir başvuru için aşağıdaki "Ek bilgi" bölümünde gösterilen tutmak istemci sağlayabilirsiniz.

Durum

Bu davranış tasarım yüzündendir.Bir proje herhangi bir genel sınıf içeriyorsa, Visual Studio 6 Service Pack 5'te MTSTransactionMode kümesi olan dışında bir 0, <a2>Katılımsız yürütme seçeneği</a2> ve <a4>Bellek gelen Koru seçeneği otomatik olarak seçilir.

Daha fazla bilgi

Davranışı Yeniden Oluşturma Adımları

A: sunucu oluşturma

  1. Bir ActiveX EXE proje oluşturmak ve bunu ThreadTest olarak yeniden adlandırın.
  2. Proje menüsünde Proje Özellikleri seçip Genel sekmesinde, İş parçacığı havuzu, iki (2).
  3. (Class1) varsayılan sınıfa aşağıdaki kodu ekleyin:
    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. Kaydetmek ve (ThreadTest.EXE) Projeyi derleyin.

B: istemci oluşturma ve sınama

  1. Standart exe DOSYASı bir proje başlatın ve, istemci olarak yeniden adlandırın.
  2. Varsayılan forma (Form1), bir komut düğmesi ve bir metin kutusu ekleyin.
  3. Form1'e aşağıdaki kodu ekleyin:
    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. Proje (Client.EXE) derleyin.
  5. Üç veya daha fazla örneğini Client.EXE başlatmak ve her formda Başlat düğmesine basın. Yukarıdaki hata iletilerinden birini veya birkaçını gördüğünüz unutmayın.

C: geçici çözümü uygulayan...

  1. ThreadTest projeyi açın.
  2. Başka bir sınıf modülü (Class2) ve kod ekleyin.
  3. Kaydetmek ve proje (ThreadTest.EXE) re-compile.
  4. Istemci projeyi açın.
  5. Form1 kodu aşağıdaki ile Değiştir:
    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. Kaydetmek ve proje (Client.EXE) re-compile.
  7. Client.EXE üç veya daha çok örneğini çalıştırmayı ve her formda Başlat düğmesine basın. Not hiçbir hata iletileri görmeniz gerekir.
Bir iş parçacığı havuzu, bir büyük olan bir ActiveX EXE DCOM üzerinden birden çok istemci tarafından erişildiğinde "Daha fazla bilgi" bölümüne C bölümünde açıklanan geçici çözüm çalışmaz. Sonuç olarak, Visual Basic 6.0 ActiveX EXE sunucular ile birden çok istemci hızla oluşturma ve nesne yok edilmesi DCOM sunucuları için uygun değildir. Bu senaryo işlemek sunucu uygulamanız gerekiyorsa, ActiveX DLL MTS yerine kullanmanız önerilir. ActiveX DLL, MTS içinde saklanacak tasarlarken, Katılımsız yürütme ve Bellek gelen Koru onay kutuları her ikisi de seçili olduğundan emin olun. Bu onay kutusu ve <a0>Proje</a0> menüsünde bulunan, Özellikler ' i seçin ve Genel sekmesini seçin.

MTS veya COM + ActiveX bileşeni'ni kullanmak istediğinizde, bir sınıf için GlobalMultiUse ınstancing özelliğini kullanmayın. Arabirim GlobalMultiUse nesnesi için önbelleğe alınan bir iş parçacığı temel tablo başına ve iş parçacığının sona kadar serbest. Sonuç olarak, arama (ancak aynı parçacığının üzerinde) farklı bir içerikle birlikte gelir, RPC_E_WRONG_THREAD ile başarısız. MTS ve COM + bileşenleri kullanmak için <a0></a0>, bilgisayarınızın sınıfları nesnelerin durum bilgisi olmayan olduğunu şekilde tasarlayın.

Bu makaledeki bilginin uygulandığı durum:
  • 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
Anahtar Kelimeler: 
kbmt kbprb kbthread kbtophit KB241896 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:241896  (http://support.microsoft.com/kb/241896/en-us/ )