Aсинхронное резервное копирование всех открытых файлов в текущей сессии Revit

Автор Тема: Aсинхронное резервное копирование всех открытых файлов в текущей сессии Revit  (Прочитано 4720 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн soloviewsergАвтор темы

  • ADN
  • *
  • Сообщений: 8
  • Карма: 2
    • soloviewserg.ru
Используем асинхронный Процессор задач

Код - vb.net [Выбрать]
  1.  
  2.  
  3. ...
  4.  
  5. Friend Shared Function SaveBackupFile(ByVal aTask As ssTask) As Boolean
  6.             Try
  7.                 If aTask Is Nothing OrElse String.IsNullOrWhiteSpace(aTask.DocumentFullPath) = True Then
  8.                     Return False
  9.                 End If
  10.  
  11.                 Dim aBackupFile As New FileInfo(aTask.DocumentFullPath)
  12.                 Dim aExtention As String = aBackupFile.Name.Substring(aBackupFile.Name.LastIndexOf("."))
  13.  
  14.                 ' by local file
  15.                 If pBackupFolder.EndsWith("\") Then
  16.                     pBackupFolder = pBackupFolder.Substring(0, pBackupFolder.Length - 1)
  17.                 End If
  18.                 Dim resultFile As FileInfo = Nothing
  19.                 If aBackupFile.Exists = True AndAlso aTask.LastBackupTime = DateTime.MinValue OrElse aBackupFile.LastWriteTime > aTask.LastBackupTime Then
  20.                     resultFile = aBackupFile.CopyTo(pBackupFolder + "\" + aBackupFile.Name.Substring(0, aBackupFile.Name.LastIndexOf(".")) + "_" + DateTime.Now.ToString("yyyy.MMMM.dd.dddd_HH.mm.ss", NumberFormatProvider) + aExtention, False)
  21.                     pTaskProcessor.ChangeTaskLastBackupTime(aTask, resultFile.LastWriteTime)
  22.                 End If
  23.                 Return True
  24.             Catch ex As System.Exception
  25.                 BuildErrorMessage(ex, False)
  26.                 Return False
  27.             End Try
  28.         End Function
  29.  
  30. ...
  31.  
  32. Imports System.Threading
  33. Namespace SoloViewSerg
  34.  
  35.     Friend MustInherit Class ssThreadWrapperBase
  36.  
  37.         Friend ReadOnly Thread As Thread
  38.  
  39.         Public Sub New()
  40.             Me.Thread = New Thread(AddressOf Me.starttask)
  41.         End Sub
  42.  
  43.         Friend Overridable Sub Start()
  44.             Me.Thread.Start()
  45.         End Sub
  46.  
  47.         Friend Overridable Sub [Stop]()
  48.             Me.Thread.Abort()
  49.         End Sub
  50.  
  51.         Private _IsCompleted As Boolean
  52.  
  53.         Friend ReadOnly Property IsCompleted As Boolean
  54.             Get
  55.                 Return _IsCompleted
  56.             End Get
  57.         End Property
  58.  
  59.         Private Sub StartTask()
  60.             _IsCompleted = False
  61.             DoTask()
  62.             _IsCompleted = True
  63.         End Sub
  64.  
  65.         Protected MustOverride Sub DoTask()
  66.  
  67.     End Class
  68. End Namespace
  69.  
  70. ...
  71.  
  72. Imports System.Threading
  73. Imports SoloViewSerg.ssApplication
  74. Namespace SoloViewSerg
  75.     Friend Class ssTaskProcessor
  76.         Inherits ssThreadWrapperBase
  77.  
  78.         Private _Tasks As New ArrayList
  79.         Friend Property Tasks As ArrayList
  80.             Get
  81.                 Return _Tasks
  82.             End Get
  83.             Set(value As ArrayList)
  84.                 _Tasks = value
  85.             End Set
  86.         End Property
  87.  
  88.         Private _StopRequested As Boolean
  89.  
  90.         Friend Sub SubmitTask(ByVal aTask As ssTask)
  91.             SyncLock _Tasks
  92.                 Dim pTask As ssTask
  93.                 For i As Int32 = 0 To _Tasks.Count - 1
  94.                     pTask = _Tasks.Item(i)
  95.                     If aTask IsNot Nothing AndAlso pTask.DocumentFullPath = aTask.DocumentFullPath Then
  96.                         Exit Sub
  97.                     End If
  98.                 Next
  99.                 _Tasks.Add(aTask)
  100.             End SyncLock
  101.         End Sub
  102.  
  103.         Friend Sub ChangeTaskLastBackupTime(ByVal aTask As ssTask, ByVal aLastBackupTime As Date)
  104.             SyncLock _Tasks
  105.                 Dim pTask As ssTask
  106.                 For i As Int32 = 0 To _Tasks.Count - 1
  107.                     pTask = _Tasks.Item(i)
  108.                     If aTask IsNot Nothing AndAlso pTask.DocumentFullPath = aTask.DocumentFullPath Then
  109.                         _Tasks.RemoveAt(i)
  110.                         _Tasks.Add(New ssTask(aTask.DocumentFullPath, aLastBackupTime))
  111.                     End If
  112.                 Next
  113.             End SyncLock
  114.         End Sub
  115.  
  116.         Friend Function GetTaskCount() As Int32
  117.             Return _Tasks.Count
  118.         End Function
  119.  
  120.         Protected Overrides Sub DoTask()
  121.             Try
  122.                 Do
  123.                     Thread.Sleep(pDocBackupInterval)
  124.                     If _Tasks.Count > 0 Then
  125.                         Dim aTask As ssTask
  126.                         SyncLock _Tasks
  127.                             For i As Int32 = 0 To _Tasks.Count - 1
  128.                                 aTask = _Tasks.Item(i)
  129.                                 If aTask IsNot Nothing Then
  130.                                     ssApplication.SaveBackupFile(aTask)
  131.                                 End If
  132.                             Next
  133.                         End SyncLock
  134.                     End If
  135.                 Loop Until _StopRequested
  136.             Catch ex As System.Exception
  137.                 'BuildErrorMessage(ex, False) 'TODO EXCLUDE IN PRODUCTION
  138.             End Try
  139.         End Sub
  140.  
  141.         Friend Overrides Sub [Stop]()
  142.             _StopRequested = True
  143.             Me.Thread.Join(TimeSpan.FromSeconds(30))
  144.             MyBase.[Stop]()
  145.         End Sub
  146.     End Class
  147. End Namespace
  148.  

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Используем асинхронный Процессор задач
Нужно понимать, что вы делитесь опытом или есть какие-то вопросы?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн soloviewsergАвтор темы

  • ADN
  • *
  • Сообщений: 8
  • Карма: 2
    • soloviewserg.ru
Коллега, позволю себе с Вами не согласиться (на счет вопросов). Хотя, IMHO, в правильно поставленном вопросе, как правило, много ответов.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Коллега, позволю себе с Вами не согласиться (на счет вопросов). Хотя, IMHO, в правильно поставленном вопросе, как правило, много ответов.
Еще раз задам вопрос: "Вам нужна помощь с этим кодом или Вы делитесь им?"
Если Вы им делитесь, то код не полный. Во всяком случае я в нём не нашел класса ssTask, да и еще кучи всего не хватает...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн soloviewsergАвтор темы

  • ADN
  • *
  • Сообщений: 8
  • Карма: 2
    • soloviewserg.ru
ssTask очевиден, инициализировать можно в ssAddRibbonPanel, еще вопросы?

Код - vb.net [Выбрать]
  1. Namespace SoloViewSerg
  2.     Friend Class ssTask
  3.         Friend Sub New(ByVal aDocumentFullPath As String, ByVal aLastBackupTime As Date)
  4.             _DocumentFullPath = aDocumentFullPath
  5.             _LastBackupTime = aLastBackupTime
  6.         End Sub
  7.  
  8.         Private _DocumentFullPath As String
  9.         Friend ReadOnly Property DocumentFullPath As String
  10.             Get
  11.                 Return _DocumentFullPath
  12.             End Get
  13.         End Property
  14.  
  15.         Private _LastBackupTime As Date
  16.         Friend ReadOnly Property LastBackupTime As Date
  17.             Get
  18.                 Return _LastBackupTime
  19.             End Get
  20.         End Property
  21.  
  22.         Private _Guid As Guid = Guid.NewGuid
  23.         Friend ReadOnly Property Guid As Guid
  24.             Get
  25.                 Return _Guid
  26.             End Get
  27.         End Property
  28.     End Class
  29. End Namespace
  30.  
  31. Imports System
  32. Imports Autodesk.Revit.UI
  33. Imports Autodesk.Revit.DB
  34. Imports Autodesk.Revit.ApplicationServices
  35. Imports Autodesk.Revit.Creation
  36. 'Imports Autodesk.Revit.Utility
  37. 'Imports Autodesk.Revit.VSTA
  38. Imports System.Drawing
  39. Imports System.Windows.Media.Imaging
  40. Imports System.Reflection
  41. Imports System.Windows.Media
  42. Imports SoloViewSerg.ssApplication
  43. Imports SoloViewSerg.ssModel
  44. Imports System.IO
  45.  
  46. Namespace SoloViewSerg
  47.  
  48.     Friend Class ssAddRibbonPanel
  49.         Implements Autodesk.Revit.UI.IExternalApplication
  50.  
  51.         Friend Shared pTaskProcessor As ssTaskProcessor
  52.  
  53.         Public Sub ApplicationDocumentClosing(sender As Object, e As Autodesk.Revit.DB.Events.DocumentClosingEventArgs)
  54.             Try
  55.                 'RemoveTaskProcessorTaskByDocumentFullPath
  56.                 Dim aTask As ssTask
  57.                 SyncLock pTaskProcessor.Tasks
  58.                     For i As Int32 = 0 To pTaskProcessor.Tasks.Count - 1
  59.                         aTask = pTaskProcessor.Tasks.Item(i)
  60.                         If aTask IsNot Nothing AndAlso aTask.DocumentFullPath = e.Document.PathName Then
  61.                             pTaskProcessor.Tasks.RemoveAt(i)
  62.                         End If
  63.                     Next
  64.                 End SyncLock
  65.             Catch ex As System.Exception
  66.                 BuildErrorMessage(ex, False)
  67.             Finally
  68.  
  69.             End Try
  70.         End Sub
  71.         Public Sub ApplicationDocumentSavedAs(sender As Object, e As Autodesk.Revit.DB.Events.DocumentSavedAsEventArgs)
  72.             Try
  73.  
  74.                 'RemoveTaskProcessorTaskByDocumentFullPath
  75.                 Dim aTask As ssTask
  76.                 SyncLock pTaskProcessor.Tasks
  77.                     For i As Int32 = 0 To pTaskProcessor.Tasks.Count - 1
  78.                         aTask = pTaskProcessor.Tasks.Item(i)
  79.                         If aTask IsNot Nothing AndAlso aTask.DocumentFullPath = pActiveDocumentFullPath Then
  80.                             pTaskProcessor.Tasks.RemoveAt(i)
  81.                         End If
  82.                     Next
  83.                 End SyncLock
  84.  
  85.                 'Document Backup
  86.                 pActiveDocumentFullPath = e.Document.PathName
  87.                 pActiveDocument = e.Document
  88.                 If pDocBackupON = True Then
  89.                     'AddTaskProcessorTaskByDocumentFullPath
  90.                     If pTaskProcessor Is Nothing Then
  91.                         pTaskProcessor = New ssTaskProcessor
  92.                         pTaskProcessor.Start()
  93.                     ElseIf pTaskProcessor.IsCompleted = True Then
  94.                         Dim aTasks As ArrayList = pTaskProcessor.Tasks
  95.                         pTaskProcessor = New ssTaskProcessor
  96.                         pTaskProcessor.Tasks = aTasks
  97.                         pTaskProcessor.Start()
  98.                     End If
  99.                     pTaskProcessor.SubmitTask(New ssTask(pActiveDocumentFullPath, DateTime.MinValue))
  100.                 Else
  101.                     If pTaskProcessor IsNot Nothing Then
  102.                         pTaskProcessor.Stop()
  103.                     End If
  104.                 End If
  105.  
  106.             Catch ex As System.Exception
  107.                 BuildErrorMessage(ex, False)
  108.             Finally
  109.  
  110.             End Try
  111.         End Sub
  112.         Public Sub ApplicationDocumentOpened(sender As Object, e As Autodesk.Revit.DB.Events.DocumentOpenedEventArgs)
  113.             Try
  114.  
  115.                 Dim textFields As String() = Nothing
  116.                 Dim errString As String = String.Empty, errDescription As String = String.Empty
  117.                 Dim aFontFamilyName As String = "Arial", aFontSize As Single = 10.0F, aFontItalic As Boolean = True, aFontUnderline As Boolean, aFontBold As Boolean, aFontStrikethrough As Boolean
  118.                 Dim alocalInterfaceLanguage As ssInterfaceLanguagesEnum = InterfaceLanguage
  119.  
  120.                 pActiveDocumentFullPath = e.Document.PathName
  121.                 pActiveDocument = e.Document
  122.  
  123.                 Try
  124.                     'ReadSaveFaceDocBackup
  125.                     Call ReadSaveFace(textFields, errString, errDescription,
  126.                                   aFontFamilyName, aFontSize, aFontItalic, aFontUnderline, aFontBold, aFontStrikethrough,
  127.                                       alocalInterfaceLanguage)
  128.                     If errString <> String.Empty OrElse textFields Is Nothing OrElse textFields.Length < 19 Then
  129.                         If dlgMain IsNot Nothing Then
  130.                             MsgBox(ResourceManagerMainShadow.GetString("Error read Data:", curUICulture) & vbCrLf &
  131.                                 errString & vbCrLf &
  132.                                 errDescription & vbCrLf &
  133.                                 ResourceManagerMainShadow.GetString("Application options will be set by default.", curUICulture), vbInformation + vbOKOnly, ResourceManagerMainShadow.GetString("Application Name", curUICulture))
  134.                         End If
  135.  
  136.                         pDocBackupON = False
  137.                         pDocBackupInterval = 6000 ' 600000
  138.                         pBackupFolder = "С:\" ' "D:\Revit MEP Projects 2013\DocumentBackup\"
  139.  
  140.                     Else
  141.  
  142.                     End If
  143.  
  144.                 Catch ex As System.Exception
  145.                     BuildErrorMessage(ex, False)
  146.                 Finally
  147.  
  148.                 End Try
  149.  
  150.                 'Check pBackupFolder
  151.                 Dim aBackupDirectory As DirectoryInfo = Nothing
  152.                 If String.IsNullOrWhiteSpace(pBackupFolder) = False Then
  153.                     aBackupDirectory = New DirectoryInfo(pBackupFolder)
  154.                 End If
  155.                 If aBackupDirectory Is Nothing OrElse aBackupDirectory.Exists = False Then
  156.  
  157.                     'DisableBackup
  158.                     pDocBackupON = False
  159.  
  160.                     If dlgMain IsNot Nothing Then
  161.                         MsgBox(ResourceManagerMainShadow.GetString("Document Backup Folder", curUICulture) & vbCrLf &
  162.                            pBackupFolder & vbCrLf &
  163.                            ResourceManagerMainShadow.GetString("is NOT exist!", curUICulture) & vbCrLf & vbCrLf &
  164.                            ResourceManagerMainShadow.GetString("Unfortunately,", curUICulture) & " " & ResourceManagerMainShadow.GetString("Asynchronous Document Backup", curUICulture) & " " &
  165.                            ResourceManagerMainShadow.GetString("is impossible.", curUICulture) & vbCrLf &
  166.                            ResourceManagerMainShadow.GetString("Try to set up exiting backup folder. Current session backup will be disabled.", curUICulture), vbCritical, ResourceManagerMainShadow.GetString("Application Name", curUICulture))
  167.                     End If
  168.                 End If
  169.  
  170.                 'Document Backup
  171.                 If pDocBackupON = True Then
  172.                     If pTaskProcessor Is Nothing Then
  173.                         pTaskProcessor = New ssTaskProcessor
  174.                         pTaskProcessor.Start()
  175.                     ElseIf pTaskProcessor.IsCompleted = True Then
  176.                         Dim aTasks As ArrayList = pTaskProcessor.Tasks
  177.                         pTaskProcessor = New ssTaskProcessor
  178.                         pTaskProcessor.Tasks = aTasks
  179.                         pTaskProcessor.Start()
  180.                     End If
  181.                     pTaskProcessor.SubmitTask(New ssTask(pActiveDocumentFullPath, DateTime.MinValue))
  182.                 Else
  183.                     If pTaskProcessor IsNot Nothing Then
  184.                         pTaskProcessor.Stop()
  185.                     End If
  186.                 End If
  187.             Catch ex As System.Exception
  188.                 BuildErrorMessage(ex, False)
  189.             Finally
  190.  
  191.             End Try
  192.         End Sub
  193.  
  194.         Public Function OnShutdown(application As Autodesk.Revit.UI.UIControlledApplication) As Autodesk.Revit.UI.Result Implements Autodesk.Revit.UI.IExternalApplication.OnShutdown
  195.             Try
  196.                 RemoveHandler application.ControlledApplication.DocumentOpened, AddressOf ApplicationDocumentOpened
  197.                 RemoveHandler application.ControlledApplication.DocumentSavedAs, AddressOf ApplicationDocumentSavedAs
  198.                 RemoveHandler application.ControlledApplication.DocumentClosing, AddressOf ApplicationDocumentClosing
  199.  
  200.                 'Document Backup
  201.                 pTaskProcessor.Stop()
  202.  
  203.                 Return (Result.Succeeded)
  204.             Catch ex As System.Exception
  205.                 BuildErrorMessage(ex, False)
  206.                 Return (Result.Failed)
  207.             Finally
  208.  
  209.             End Try
  210.         End Function
  211.  
  212.         Public Function OnStartup(application As Autodesk.Revit.UI.UIControlledApplication) As Autodesk.Revit.UI.Result Implements Autodesk.Revit.UI.IExternalApplication.OnStartup
  213.             Try
  214.  
  215.                 Dim ssRevitUtilitesAssembly As [Assembly]
  216.                 ssRevitUtilitesAssembly = [Assembly].GetAssembly(Me.GetType)
  217.                 Dim projectFullPath As String = ssRevitUtilitesAssembly.Location
  218.                 pProjectPath = ssRevitUtilitesAssembly.Location.Substring(0, ssRevitUtilitesAssembly.Location.LastIndexOf("\") + 1)
  219.  
  220.                 AddHandler application.ControlledApplication.DocumentOpened, AddressOf ApplicationDocumentOpened
  221.                 AddHandler application.ControlledApplication.DocumentSavedAs, AddressOf ApplicationDocumentSavedAs
  222.                 AddHandler application.ControlledApplication.DocumentClosing, AddressOf ApplicationDocumentClosing
  223.  
  224.                 ' add new ribbon panel
  225.                 Dim ribbonPanel As RibbonPanel = application.CreateRibbonPanel("ssRevitUtilitesRibbonPanel")
  226.                 Dim PushButton1 As PushButton = ribbonPanel.AddItem(New PushButtonData("SoloViewSerg - ssRevitUtilites", "SoloViewSerg - ssRevitUtilites", projectFullPath, "SoloViewSerg.ssCommand"))
  227.                 PushButton1.SetContextualHelp(New ContextualHelp(ContextualHelpType.ChmFile, pProjectPath & "ssUtilites_EN.html"))
  228.                 Dim largeImage As BitmapImage = New BitmapImage(New Uri(pProjectPath & "ssRevitUtilites.ico"))
  229.  
  230.                 PushButton1.LargeImage = largeImage
  231.                 Return Result.Succeeded
  232.             Catch ex As Exception
  233.                 BuildErrorMessage(ex, False)
  234.                 Return Result.Failed
  235.             End Try
  236.         End Function
  237.  
  238.         ...
  239.  
  240.     End Class
  241. End Namespace
  242.  

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение