先叙述一下我目前碰到的问题
我是要做马达的控制 然后它有提供API给我使用 但是范例文件没有写成多线程
所以有些动作操作上变得不是很方便 所以我想将它改成多线程的方式
当然要获得触发动作的API控制权 它要先经过两道子程序的手续去做mapping
硬件内存的动作 也就是下面的code:
Private g_hController As Int32
Private g_hDevice As Int32
Private g_hAxis(2) As Int32
Sub motionapiopen()
Dim ComDevice As COM_DEVICE
Dim rc As Long
ComDevice.ComDeviceType = ApiDefs.COMDEVICETYPE_PCI_MODE
ComDevice.PortNumber = 1
ComDevice.CpuNumber = spn_CpuNo.Value
‘====以下省略…
rc = ymcOpenController(ComDevice, g_hController)
‘====以下省略
rc = ymcSetAPITimeoutValue(30000)
‘====以下省略
End Sub
Sub getaxishandle()
Dim rc As Long
Dim i As Long
Dim AxisName As String
rc = ymcClearAllAxes()
If rc <> MP_SUCCESS Then
MsgBox("Error ymcSetAPITimeoutValue" & vbCrLf & "ErrorCode [" & Hex(rc) & "]")
Exit Sub
End If
For i = 1 To spn_Axis.Value
AxisName = "Axis-" & i
rc = ymcDeclareAxis(1, 0, 3, i, i, ApiDefs.REAL_AXIS, AxisName, g_hAxis(i - 1))
If rc <> MP_SUCCESS Then
MsgBox("Error ymcDeclareAxis" & vbCrLf & "ErrorCode [" & Hex(rc) & "]")
Exit Sub
End If
Next i
rc = ymcDeclareDevice(spn_Axis.Value, g_hAxis(0), g_hDevice)
If rc <> MP_SUCCESS Then
MsgBox("Error ymcDeclareDevice" & vbCrLf & "ErrorCode [" & Hex(rc) & "]")
Exit Sub
End If
End Sub
原本它是设计成让UI去触发这两道程序 这中间其实没什么问题 但问题来了
我要开始控制马达动作 我是透过建立一个新线程去触发动作的
‘==============
开始线程 = New Thread(AddressOf starting) : 开始线程.Start()
‘===========
Sub starting
‘starting内容省略
End
但是在这个线程中却又要再做一次上面那两道程序 才能mapping到硬件的内存位置
所以我目前是这么做的
Sub starting
Motionapiopen()
Getaxishandle()
‘starting内容省略
End
这样的做法我觉得不是很好 而且好像让程序不太稳定 使用上常常有出错的状况
所以我想让UI在触发Motionapiopen和Getaxishandle这两道子程序的时候
它们的内存状态可以在各线程之间是共享的
我查了些数据好像是可以使用shard这个东西
所以我稍微修改一下代码 跑出一个不太理解的状况

这道子程序调用到UI的Numeric的value值 就变成报错了
可以请各位大大指引小弟 这个线程间共享内存的技术要怎么做才行呢?
------解决方案--------------------
没有仔细看你的程序。
单个外设的(应用程序级的)底层控制,设计为一个Share的类型就行了,用不着 New 新的对象。
然后调用时具体操作时,可能在必要的地方(成为“临界区”),应该使用 Lock(obj) 的形式,让多线程调用者“只有一个线程可以进入临界区”。
什么地方是需要管理多线程的临界区?仅仅是你能够测试出多线程并行操作时会产生异常的地方。
------解决方案--------------------
Sub不用定义为Shared,跨线程访问窗体控件建议使用委托