当前位置: 代码迷 >> VB Dotnet >> 怎么让新建的线程能共享UI线程的内存
  详细解决方案

怎么让新建的线程能共享UI线程的内存

热度:161   发布时间:2016-04-25 02:19:46.0
如何让新建的线程能共享UI线程的内存?
先叙述一下我目前碰到的问题

我是要做马达的控制 然后它有提供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,跨线程访问窗体控件建议使用委托
  相关解决方案