各位大神,小弟使用MATLAB的com組件方式將.m的函式打包生成了dll,然后在vb.net中呼叫。程式如下,在界面載入時我進行了初始化(由于初始化速度慢,所以在載入視窗時選擇了初始化,而沒有在后續呼叫之前初始化),然后當點擊“按鈕1”和“按鈕2”是分別可以使用不同的引數呼叫已經初始化的函式計算。但是我在除錯的程序中發現,當使用按鈕1和按鈕2進行了多次計算后,會彈出提示“嘗試讀寫受保護的記憶體”,這個時候就沒法繼續使用了,只能關閉軟體并重新再打開。請教一下各位大神這是由于多次使用calculation_function1函式導致的么?我應該怎么處理能避免出現這個問題?在此先行謝過。
Public Class Form1
Public calculation_function1 As add_com.jisuan‘參考dll
Dim c As Double
'界面載入
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
calculation_function1 = New add_com.jisuan '載入時初始化
End Sub
'按鈕1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
calculation_function1.add(1, c, 引數1, 引數2)
End Sub
'按鈕2
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
calculation_function1.add(1, c, 引數3, 引數4)
End Sub
End Class
麻煩大神能不能給看一下這個情況,我又使用了一個簡單的模型來測記憶體。使用matlab的函式(一個很簡單的求和函式)生成了com組件,然后在vb.net中進行呼叫。在進行呼叫時,發現如果使用下面的方式記憶體會一直增加。ReleaseComObject回傳的值n是0,表示應該已經釋放完了,但是記憶體一直沒有下降。
calculation_function1 = New add_com.jisuan '載入時初始化
For i = 1 To 1000
calculation_function1.add(1, c, i, 2)
TextBox1.Text = c
Next
n = Marshal.ReleaseComObject(calculation_function1)
但是我使用下面的方法時,記憶體一直很穩定。我的問題是同樣是呼叫多次calculation_function1,初始化和釋放的位置不同(比如我這兩個例子)為什么會導致記憶體一個釋放完成,一個釋放未完成呢? 上面的程式,在回圈外面進行初始化是我希望的,因為每次初始化com組件時速度比較慢,所以同樣是進行完整的一次回圈,計算速度上面明顯要快。有什么辦法修改代碼即保證計算速度,同時記憶體又可以正確釋放呢?先行謝過。
For i = 1 To 1000
calculation_function1 = New add_com.jisuan '載入時初始化
calculation_function1.add(1, c, i, 2)
TextBox1.Text = c
n = Marshal.ReleaseComObject(calculation_function1)
Next