ID Artikel: 241896 - Kajian Terakhir: 20 September 2011 - Revisi: 2.0

Threading masalah dengan komponen Visual Basic 6.0 ActiveX

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.

Pada Halaman ini

Perbesar semua | Perkecil semua

GEJALA

Ketika menggunakan komponen Visual Basic 6.0 ActiveX di lingkungan multi-threaded, Anda harus menyadari potensi masalah berikut:

ActiveX DLL host di klien multi-threaded

  • Pelanggaran akses di dalam MSVBVM60.DLL.
  • Klien memasuki keadaan kebuntuan.
Anda mungkin melihat gejala ini dua jika Visual Basic ActiveX DLL host di lingkungan multi-threaded, misalnya, IIS, MTS, atau klien multi-threaded, dan Mempertahankan dalam memori pilihan tidak diaktifkan. Untuk mengaktifkan opsi ini, ikuti langkah-langkah berikut:
  1. Dari Project menu, pilih Properti proyek.
  2. Pada General tab, pastikan bahwa Threading Model apartemen Threaded, kemudian pilih Eksekusi tanpa pengawasan dan Mempertahankan dalam memori kotak centang*.
  3. Simpan proyek dan mengkompilasi DLL.
* Catatan The Eksekusi tanpa pengawasan opsi ini tidak tersedia jika proyek berisi setiap elemen antarmuka pengguna, seperti bentuk atau kontrol. The Mempertahankan dalam memori opsi ini tidak tersedia jika Eksekusi tanpa pengawasan tidak dipilih.

Catatan Sebelum paket layanan 3 untuk Visual Studio 6.0, itu adalah mungkin untuk mendapatkan AV selama proses pematian dengan Simpanlah di memori diaktifkan. Ini telah diperbaiki dalam paket layanan Visual Studio 6.0:
http://msdn2.Microsoft.com/en-US/vstudio/aa718364.aspx' (http://msdn2.microsoft.com/en-us/vstudio/aa718364.aspx)

Jika proyek ActiveX DLL atau UserControl berisi deklarasi API, Anda mungkin mengalami deadlock selama proses/thread ditutup atau objek penciptaan, bahkan jika Eksekusi tanpa pengawasan kotak centang telah dipilih dari ActiveX DLL.Untuk solusi masalah ini, Anda dapat menggunakan perpustakaan jenis bukan menetapkan dalam Visual Basic. Untuk informasi tambahan tentang cara menggunakan perpustakaan jenis, klik nomor artikel 2% di bawah ini untuk melihat artikel % 2 pada Basis Pengetahuan Microsoft:
189133  (http://support.microsoft.com/kb/189133/EN-US/ ) HOWTO: Membuat C DLL lebih mudah diakses oleh VB dengan perpustakaan jenis

ActiveX EXE diakses oleh klien multi-threaded atau oleh beberapa single - atau multi - threaded klien

Runtime error '7': memori dan kadang-kadang diikuti oleh operasi disk error.
Galat run-time '430': kelas tidak mendukung otomatisasi atau tidak mendukung antarmuka diharapkan.
Galat run-time '424': objek yang diperlukan.
Galat run-time '-2147023170 (800706be)': otomatisasi kesalahan. Panggilan prosedur jauh gagal.
Galat run-time '-2147287010 (8003001e)': otomatisasi kesalahan. Ini adalah "disk error terjadi selama operasi baca." didasarkan pada ErrLook.
Proses server tambahan (ThreadTest.EXE) yang dibuat meskipun properti Instancing Class1 ditandai MultiUse.
Anda dapat melihat pesan kesalahan yang terdaftar di atas jika Anda memiliki server ActiveX EXE dengan kolam benang lebih dari satu (1), dan klien multi-threaded atau beberapa single - atau multi - threaded klien dengan cepat membuat dan menghancurkan objek di dalam server. Untuk mengatasi masalah ini, Anda dapat membuat kelas kosong di server lokal dan memiliki klien yang menjaga referensi untuk itu seperti yang ditunjukkan di bagian "Informasi lebih lanjut" di bawah ini.

STATUS

Perilaku ini sesuai rancangannya.Dalam Visual Studio 6 layanan paket 5, jika proyek berisi setiap kelas publik yang telah MTSTransactionMode mengatur untuk apa-apa selain 0, the Eksekusi tanpa pengawasan pilihan dan Mempertahankan dalam memoripilihan terpilih secara otomatis.

INFORMASI LEBIH LANJUT

Langkah-langkah mereproduksi perilaku

J: membuat server

  1. Membuat proyek ActiveX EXE dan mengubah nama itu ThreadTest.
  2. Dari Project menu, pilih Properti proyek dan di General tab, pilih Thread kolam renang dari dua (2).
  3. Tambahkan kode berikut untuk kelas standar (Class1):
    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. Simpan dan mengkompilasi proyek (ThreadTest.EXE).

B: menciptakan klien dan pengujian

  1. Mulai projek Standard EXE dan mengubah nama itu Klien.
  2. Tambahkan tombol perintah dan textbox ke bentuk standar (Form1).
  3. Tambahkan kode berikut untuk 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. Mengkompilasi proyek (Client.EXE).
  5. Mulai tiga atau lebih contoh Client.EXE dan tekan Mulai tombol pada setiap bentuk. Perhatikan bahwa Anda melihat satu atau lebih pesan kesalahan di atas.

C: menerapkan solusi

  1. Buka proyek ThreadTest.
  2. Menambahkan kelas modul lain (Class2) dengan tidak ada kode.
  3. Simpan dan re-compile proyek (ThreadTest.EXE).
  4. Buka proyek klien.
  5. Ganti kode dalam Form1 dengan berikut:
    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. Simpan dan re-compile proyek (Client.EXE).
  7. Menjalankan tiga atau lebih contoh Client.EXE dan tekan Mulai tombol pada setiap bentuk. Perhatikan bahwa Anda harus melihat tidak ada pesan kesalahan.
Ketika ActiveX EXE dengan kolam benang lebih besar daripada satu diakses oleh beberapa klien melalui DCOM, solusi yang dijelaskan dalam bagian c dari bagian "Informasi selengkapnya" tidak bekerja. Sebagai akibatnya, Visual Basic 6.0 ActiveX EXE server tidak cocok untuk DCOM server dengan beberapa klien dengan cepat membuat dan menghancurkan objek. Jika aplikasi server Anda perlu menangani skenario ini, sangat disarankan bahwa Anda menggunakan ActiveX dll di MTS sebagai gantinya. Ketika merancang ActiveX dll yang diselenggarakan di MTS, Anda harus memastikan bahwa Eksekusi tanpa pengawasan dan Mempertahankan dalam memori kotak centang keduanya dipilih. Kotak centang ini dan terletak di Project menu, ketika Anda memilih Properti, lalu pilih General tab.

Jangan gunakan GlobalMultiUse proses properti untuk kelas ketika Anda berniat untuk menggunakan komponen ActiveX di bawah MTS atau COM +. Antarmuka untuk GlobalMultiUse objek yang di-cache dalam per benang berbasis tabel dan tidak dibebaskan sampai benang berakhir. Akibatnya, jika panggilan datang dengan konteks yang berbeda (meskipun pada kain yang sama), itu gagal dengan RPC_E_WRONG_THREAD. Untuk menggunakan komponen dalam MTS dan COM +, Anda harus desain kelas Anda sedemikian rupa bahwa benda-benda tak berkewarganegaraan.

Berlaku bagi:
  • Microsoft Visual Studio 6.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Professional Edition
Kata kunci: 
kbprb kbthread kbtophit kbmt KB241896 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:241896  (http://support.microsoft.com/kb/241896/en-us/ )