Подскажите. К примеру нужно решить долговременную задачу для обработки примитивов.
Решил сделать обработку подпрограммы в потоке.
И вот столкнулся с такой проблемой, когда подпрограмма, которая решает задачу
выполняется в потоке, то не возможно сделать изменения в базе данных.
Возникает исключение "eLockVialetion".
Как обойти эту проблему?
Вот код тестовой команды:
<CommandMethod("TEST")> _
Public Shared Sub COMM_TEST()
Dim db As Database = acadnet_document_GetDatabase() ' Эта функция у меня возвращает объект базы работает хорошо
Dim FrmProc = New FrmProgress ' Создаю экземпляр формы процесса с ProgressBar и кнопка "отмена"
FrmProc.db = db ' ссылка на базу записываю в поле формы
FrmProc.Show() ' показываю форму
FrmProc.CollectionObj = ... ' тут к примеру будем получать список идентификаторов примитивов (но он просто заведомо у меня есть)
FrmProc.Start() ' Стартую поток
End Sub
Вот код формы демонстрирующий ход процесса
Public Class FrmProgress
Public Ext As Boolean = False
Public db As Database ' ссылка на базу
Public CollectionObj as List(Of String) ' Коллекция Handle примитивов
' Создание и старт потока
Public Sub Start()
Dim Tr As New System.Threading.Thread(AddressOf EXECUTE)
Tr.Start()
End Sub
' Команда отмены
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Ext = True
Me.Close()
End Sub
' Команда реализующая задуманное (к примеру поменять цвет у примитивов)
Public Sub EXECUTE()
Me.txtProc.Text = "Подождите, пока программа поменяет цвета примитивам..."
Me.txtProc.Invalidate()
Me.barProcess.Maximum = 10
Dim i As Integer = 0
Dim dec As Integer = Me.CollectionObj.Count \ 10 ' будем менять процесс по 10%
Dim kp As Integer = 0
For Each H As String In Me.CollectionObj
If (i = kp * dec) Then
If kp <= Me.barProcess.Maximum Then
Me.barProcess.Value = kp
Me.Invalidate()
kp += 1
End If
End If
If Me.Ext Then Exit Sub ' досрочный выход по кнопке "Отмена"
acadnet_Primitive_SetColor(H, 6, Me.db) ' окрашиваем примитив в розовый цвет = 6
i += 1
Next
Me.Button1.Text = "Закрыть"
End Sub
End Class
И вот код подпрограммы меняющий цвет примитиву
Public Shared Sub acadnet_Primitive_SetColor(ByVal H As String, _
ByVal cVal As Integer, _
ByRef db As Database)
Using trans As Transaction = db.TransactionManager.StartTransaction
Try
Dim ln As Long = Convert.ToInt64(H, 16)
Dim Hn = New Handle(ln)
Dim ID = db.GetObjectId(False, Hn, 0)
Dim dbObj = trans.GetObject(ID, OpenMode.ForWrite, False, True)
Dim ent = DirectCast(dbObj, Entity)
If (ent IsNot Nothing) Then
ent.UpgradeOpen()
ent.ColorIndex = cVal
End If
Catch ex As System.Exception
' тут вот eLockVialation
End Try
trans.Commit()
End Using
End Sub