找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5446|回复: 1

[求助] 请教下数据同步的问题

[复制链接]

7

主题

38

回帖

0

精华

铜牌会员

积分
247
发表于 2011-7-8 20:32:34 | 显示全部楼层 |阅读模式
我用VB2005,多线程运行同一任务,但是会存取主线程(窗体)中的数据,因此要加锁。

可是,Monitor.Enter虽然不同线程互斥,但是同一线程却可以多次锁定,而我希望不管是不是同一线程,同一时刻只希望锁定一次。想来想去,就做了个类,类里边开启线程来锁定对象,这样在主程序中每次锁定都是在不同的线程。
但是测试了下,发现没有效果。

不知道什么原因?或者有什么别的好办法?

-----------------------------------------------
主程序:
Dim objLock as New Object

使用时,在子程序中:
Dim myLock as New MyMonit()
myLock.Enter(objLock)
...
myLock.Exit()

------------------------------------------------
我写的类:
   Public Class MyMonit
        Dim Locked As Boolean = False
        Dim WithEvents bgw As New System.ComponentModel.BackgroundWorker()

        Public Sub Enter(ByVal objLock As Object)
            Locked = True
            bgw.RunWorkerAsync(objLock)
        End Sub

        Public Sub [Exit]()
            Locked = False
        End Sub

        Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
            System.Threading.Monitor.Enter(e.Argument)
            Do While Locked
                System.Threading.Thread.Sleep(1)
                Application.DoEvents()
            Loop
            System.Threading.Monitor.Exit(e.Argument)
        End Sub
    End Class

7

主题

38

回帖

0

精华

铜牌会员

积分
247
 楼主| 发表于 2011-7-9 08:32:09 | 显示全部楼层
自己发现问题了:
在自己的类中,锁定时阻止了自己,但是因为不是在主程序中锁定,所以主程序继续下一句了。

改成下边了,但是发现在主程序中,如果上一个锁定的代码还在执行,在另一个地方锁定的话,
就陷入第2次锁定的死循环中了。
不知道有什么好办法没有?

------------------------------------------------
Public Class MyMonit
    Dim Locked As Boolean = False
    Dim flg As String = "---"
    Dim WithEvents bgw As New System.ComponentModel.BackgroundWorker()

    Public Sub New(ByVal objLock As Object, ByVal flg As String)
        Me.flg = flg
        bgw.RunWorkerAsync(objLock)
    End Sub

    Public Sub WaitUntilLocked()
        Do Until Locked
            System.Threading.Thread.Sleep(10)
            Application.DoEvents()
            'Debug.Print("Wait Locked " & flg & ", " & Now)
        Loop
    End Sub

    Public Sub [Exit]()
        Locked = False
    End Sub

    Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
        System.Threading.Monitor.Enter(e.Argument)
        Locked = True
        Debug.Print("Locked " & Now)
        Do While Locked
            System.Threading.Thread.Sleep(1)
            Application.DoEvents()
        Loop
        System.Threading.Monitor.Exit(e.Argument)
    End Sub

    Private Sub bgw_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted
        Me.bgw.Dispose()
    End Sub

End Class
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表