以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]请教“逛逛” 老师,“队列使用的简例”的一些问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=78711)

--  作者:zyqzyy
--  发布时间:2015/12/15 15:46:00
--  [求助]请教“逛逛” 老师,“队列使用的简例”的一些问题
按老师的“队列使用的简例”
随机出现下面两个问题:
1、 连接未关闭. 连接的当前状态为正在连接
2、如下图:


图片点击可在新窗口打开查看此主题相关图片如下:数据源01.png
图片点击可在新窗口打开查看
队列处理函数:

If  Vars("逻辑1") > 0 AndAlso _MyQueue IsNot Nothing AndAlso  _MyQueue.Count > 0  Then
    Dim dr As DataRow = _MyQueue.Dequeue   \'获取队列的第一个值
    Dim Change As String = dr("ChangeType")
    Dim ftpfile As String
    If dr.IsNull("FtpPath") = True    \'合成文件明细表的文件名
        ftpfile =  dr("FullPath").Replace(getConfigValue("LocalPath",""),"").Replace("\\","/")
    Else
        ftpfile =  dr("FtpPath").Replace("\\","/")
    End If
    Dim s As String
    Dim ftpPath1 As String
    ftpPath1 = dr("FtpPath")
    s = FileSys.GetName(dr("FullPath"))  \'取出文件名,用于合成ftp上传路径
    ftpPath1 = ftpPath1.Replace(s,"")    \'生成本地的目录(网盘下的目录),用于建立ftp目录
    Dim ftpPath As String
    ftpPath = getConfigValue("FtpPath","")  &  ftpPath1   \'合成传递ftp上传文件路径
    Dim fname As String = dr("FullPath").Replace(GetConfigValue("LocalPath",""),"").Replace("\\","/")   \'合成文件明细表的文件名
   
    Dim dsys As DataRow
    dsys = DataTables("System_Set").Find("User_Name = \'" & User.Name & "\'")   \'取出ftp"根目录"
    If dsys Is Nothing
        Return Nothing
    End If
    dr("success") = 2   \'正在同步
    dr.Save()
    \'Dim det As String = dsys("UnitName") & "|" & dsys("DepartmentOne")  & "|" & dsys("User_Name")  \'用户信息:0单位1科室2用户名
    Dim d As DataRow
    d = DataTables("FilesTB").SQLFind("[UnitName] = \'" & dsys("UnitName") & "\' and  [DepartmentOne] = \'" & dsys("DepartmentOne") & "\' and  [User_Name] = \'" & dsys("User_Name") & "\' and [FtpPath] = \'" & fname & "\'")
    If d IsNot Nothing

If dr.Isnull("OldName") = False  \'文件重命名事件的处理
            If dr("ChangeType") = "Deleted" OrElse dr("ChangeType") = "Changed"    \'文件删除事件的处理
                DataTables("TempTable").ReplaceFor("OldName","","[FullPath] = \'" & dr("FullPath") & "\'")   \'删除事件记录表中重命名的内容
            Else
                Dim a0,a1,a2,a3 As String
                a3 = getConfigValue("LocalPath","") &  dr("OldName").Replace("/","\\")  \'Renamed3   原本地文件名(路径)
                a2 = getConfigValue("LocalPath","")  &  dr("FtpPath").Replace("/","\\")   \'Renamed2   新本地文件名(路径)
                a1 = getConfigValue("FtpPath","")  & dr("FtpPath")   \'Renamed1   新ftp文件名
                a0 = getConfigValue("FtpPath","")  & dr("OldName")   \'Renamed0   原ftp文件名
                If Functions.Execute("Renamed",a0,a1,a2,a3) = True
                    dr("success") = 3  \'重命名成功
                    Vars("逻辑1") += 1   \'通知执行下一个任务
                Else
                    dr("success") = 1  \'重命名失败
                    dr("Failure") += 1
                    Vars("逻辑1") += 1   \'通知执行下一个任务
                End If
                dr.Save()
            End If
           
        ElseIf Change = "Deleted"
            ThreadCount = 0
            ThreadSum = 0
            ThreadSum += 1  \'下载的任务数加1
            UpdateOff = False
            If Functions.Execute("Deleted",ftpPath & s ,dr("FullPath"),ftpfile) = True  \'参数1 ftp路径及文件名,参数2本地路径及文件名 ,参数3:明细表中的文件名
                dr("success") = 3  \'文件删除成功
                Vars("逻辑1") += 1   \'通知执行下一个任务
            Else
                dr("success") = 1  \'文件删除失败
                dr("Failure") += 1
                Vars("逻辑1") += 1   \'通知执行下一个任务
            End If
            dr.Save()
           
        ElseIf Change = "Created" OrElse dr("ChangeType") = "Changed" OrElse (dr.isnull("OldName") And  dr("ChangeType") = "Renamed")    \'文件新建,更改事件的处理
            If FileSys.FileExists(dr("FullPath"))   \'本地文件不存在则删除事件记录
                If FileIsOpened(dr("FullPath")) = False Then
                    Dim ifo As New FileInfo(dr("FullPath"))
                    If ifo.Length > 0   \'文件的内容为空值,不上传,直接标记为成功,这种情况:新建文件还未添加内容
                        If  CRCCheckFile(dr("FullPath")) > ""
                            d = DataTables("FilesTB").AddNew()  \'添加文件
                            d("FtpPath") = dr("FtpPath")
                            d("CRCCheck") = CRCCheckFile(dr("FullPath"))
                            d("UnitName") = dsys("UnitName")
                            d("DepartmentOne") = dsys("DepartmentOne")
                            d("User_Name") = dsys("User_Name")
                            d("date") = Date.Now()
                            d.Save()
                            If Functions.Execute("FileCreated",dr("FullPath"),ftpPath,ftpPath & s ) = True   \'参数1本地路径及文件名, ,参数2ftp路径,,参数3ftp路径及文件名
                                dr("success") = 3
                                Vars("逻辑1") += 1   \'通知执行下一个任务
                            Else
                                dr("success") = 1  \'文件建,改失败
                                dr("Failure") += 1
                                Vars("逻辑1") += 1   \'通知执行下一个任务
                            End If
                        Else
                            dr("success") = 1   \'事件记录表标记为1失败
                            dr("Failure") += 1
                            Vars("逻辑1") += 1   \'通知执行下一个任务
                            \'DataTables("TempTable").ReplaceFor("success",1,"FullPath = \'" & dr1("FullPath") & "\'")   \'事件记录表标记为1,失败!
                        End If
                    Else
                        dr("success") = 3
                        Vars("逻辑1") += 1   \'通知执行下一个任务
                    End If
                Else
                    dr("success") = 1   \'事件记录表标记为1失败
                    dr("Failure") += 1
                    Vars("逻辑1") += 1   \'通知执行下一个任务
                End If
            End If
           
        ElseIf Change = "Dn"
            Dim  locName = (GetConfigValue("LocalPath","") & dr("FullPath")).Replace("/","\\")  \'合成 本地文件名及路径
            Dim  nFTP =  dr("FullPath")   \' ftp文件名及路径
            \' UpdateOff = False  \'关闭文件监视器
            ThreadCount = 0
            ThreadSum = 0
            ThreadSum += 1    \'下载的任务数加1
            UpdateOff = False
            If Functions.Execute("FTPDown",locName,nFTP,dr("Failure"),GetConfigValue("UserInfo","")) = True   \'参数1本地文件,\'参数2 ftp文件名,\'参数3 同步次数 参数4\'用户信息:0单位1科室2用户名
                dr("success") = 3
                Vars("逻辑1") += 1   \'通知执行下一个任务
            Else
                dr("success") = 1  \'文件下载失败
                dr("Failure") += 1
                Vars("逻辑1") += 1   \'通知执行下一个任务
            End If
            dr.Save()
           
        ElseIf Change = "Up"
            Dim ftn As String = dr("FullPath")
            ftn = ftn.Replace(GetConfigValue("LocalPath",""),"")  \'合成ftp文件名及路径
            If  Functions.Execute("FileUpload",dr("FullPath"),ftn) = True
                dr("success") = 3
                Vars("逻辑1") += 1   \'通知执行下一个任务
            Else
                dr("success") = 1  \'文件上传失败
                dr("Failure") += 1
                Vars("逻辑1") += 1   \'通知执行下一个任务
            End If
            dr.Save()
        End If
    End If
Else
    Vars("逻辑1") = -1
End If

[此贴子已经被作者于2015/12/15 15:51:07编辑过]

--  作者:大红袍
--  发布时间:2015/12/15 15:50:00
--  

上传具体例子测试。


--  作者:zyqzyy
--  发布时间:2015/12/15 15:55:00
--  
源文件不方便上传,慢慢做例子!
--  作者:大红袍
--  发布时间:2015/12/15 16:02:00
--  
你用多线程修改同一个资源很容易出问题的,这个就是foxtable为什么不敢做异步加载的缘故。
--  作者:zyqzyy
--  发布时间:2015/12/16 9:27:00
--  
感谢,知道原因是“多线程修改同一个资源的问题”,基本解决!测试中。
--  作者:逛逛
--  发布时间:2015/12/16 11:04:00
--  
多线程  要注意委托的使用

任何跨线程的调用,尽量使用委托