PageRenderTime 53ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/Tasks/Cache.vb

#
Visual Basic | 267 lines | 129 code | 55 blank | 83 comment | 0 complexity | 0367eeb5dc579c75af8ce240626e4e86 MD5 | raw file
Possible License(s): GPL-2.0
  1. Imports System.Threading
  2. Imports System.ComponentModel
  3. Public Class Common
  4. Public Shared Tasks As New TaskCache
  5. End Class
  6. Public Class TaskCache
  7. Implements IList(Of ITask), System.ComponentModel.INotifyPropertyChanged, IListSource
  8. Private Tasks As New List(Of ITask)
  9. Public MainThread As New Thread(New ThreadStart(AddressOf RunTasks))
  10. Public Threads As New List(Of Threading.Thread)
  11. Public Property MaxThreads As Integer = 16
  12. Public Property Done As Boolean
  13. Public Sub StartTaskEngine()
  14. MainThread.Start()
  15. End Sub
  16. Private Sub RunTasks()
  17. Do Until Done
  18. Try 'This Try block lets me be really lazy and ignore the fact that if a new task is created it breaks the enumeration and starts the whole process
  19. For Each Task In Tasks
  20. If Task.State = TaskState.NotStarted Then
  21. If Not Threads.Count > MaxThreads Then
  22. Dim NewThread As Thread = New Thread(New ThreadStart(AddressOf Task.Run))
  23. Threads.Add(NewThread)
  24. NewThread.Start()
  25. Me.NotifyPropertyChanged("UnrunTaskCount")
  26. Me.NotifyPropertyChanged("UserWaitTaskCount")
  27. End If
  28. End If
  29. Next
  30. Dim I As Integer = 0
  31. Do
  32. If I > Threads.Count - 1 Then Exit Do
  33. If Threads(I).ThreadState = ThreadState.Stopped Then
  34. Threads.Remove(Threads(I))
  35. Continue Do
  36. Me.NotifyPropertyChanged("CompletedTaskCount")
  37. End If
  38. I += 1
  39. Loop
  40. Catch
  41. Finally
  42. Thread.Sleep(1)
  43. End Try
  44. Loop
  45. End Sub
  46. Public Sub Add(item As ITask) Implements System.Collections.Generic.ICollection(Of ITask).Add
  47. Tasks.Add(item)
  48. End Sub
  49. Public Sub Clear() Implements System.Collections.Generic.ICollection(Of ITask).Clear
  50. Tasks.Clear()
  51. Threads.Clear()
  52. End Sub
  53. Public Function Contains(item As ITask) As Boolean Implements System.Collections.Generic.ICollection(Of ITask).Contains
  54. Return Tasks.Contains(item)
  55. End Function
  56. Public Sub CopyTo(array() As ITask, arrayIndex As Integer) Implements System.Collections.Generic.ICollection(Of ITask).CopyTo
  57. Tasks.CopyTo(array)
  58. End Sub
  59. Public ReadOnly Property Count As Integer Implements System.Collections.Generic.ICollection(Of ITask).Count
  60. Get
  61. Return Tasks.Count
  62. End Get
  63. End Property
  64. Public ReadOnly Property IsReadOnly As Boolean Implements System.Collections.Generic.ICollection(Of ITask).IsReadOnly
  65. Get
  66. Return False
  67. End Get
  68. End Property
  69. Public Function Remove(item As ITask) As Boolean Implements System.Collections.Generic.ICollection(Of ITask).Remove
  70. Return Tasks.Remove(item)
  71. End Function
  72. Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of ITask) Implements System.Collections.Generic.IEnumerable(Of ITask).GetEnumerator
  73. Return Tasks.GetEnumerator
  74. End Function
  75. Public Function IndexOf(item As ITask) As Integer Implements System.Collections.Generic.IList(Of ITask).IndexOf
  76. Return Tasks.IndexOf(item)
  77. End Function
  78. Public Sub Insert(index As Integer, item As ITask) Implements System.Collections.Generic.IList(Of ITask).Insert
  79. Tasks.Insert(index, item)
  80. End Sub
  81. Default Public Property Item(index As Integer) As ITask Implements System.Collections.Generic.IList(Of ITask).Item
  82. Get
  83. Return Tasks.Item(index)
  84. End Get
  85. Set(value As ITask)
  86. Tasks.Item(index) = value
  87. End Set
  88. End Property
  89. Public Sub RemoveAt(index As Integer) Implements System.Collections.Generic.IList(Of ITask).RemoveAt
  90. Tasks.RemoveAt(index)
  91. End Sub
  92. Public Function GetEnumerator1() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
  93. Return Me.GetEnumerator
  94. End Function
  95. Public ReadOnly Property UnrunTaskCount
  96. Get
  97. Dim Count = (From Task As ITask In Tasks Where Task.State = TaskState.NotStarted Or Task.State = TaskState.WaitingForDependancies).Count
  98. Return Count
  99. End Get
  100. End Property
  101. Public ReadOnly Property UserWaitTaskCount
  102. Get
  103. Dim Count = (From Task As ITask In Tasks Where Task.State = TaskState.WaitingForUserInput).Count
  104. Return Count
  105. End Get
  106. End Property
  107. Public ReadOnly Property CompletedTaskCount
  108. Get
  109. Dim Count = (From Task As ITask In Tasks Where Task.State = TaskState.Completed Or Task.State = TaskState.CriticalFault Or Task.State = TaskState.Fault).Count
  110. Return Count
  111. End Get
  112. End Property
  113. Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
  114. Private Sub NotifyPropertyChanged(ByVal info As String)
  115. RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
  116. End Sub
  117. Public ReadOnly Property ContainsListCollection As Boolean Implements System.ComponentModel.IListSource.ContainsListCollection
  118. Get
  119. If Me.Count > 0 Then
  120. Return True
  121. Else
  122. Return False
  123. End If
  124. End Get
  125. End Property
  126. Public Function GetList() As System.Collections.IList Implements System.ComponentModel.IListSource.GetList
  127. Return Me.Tasks
  128. End Function
  129. End Class
  130. 'Private Sub cmdTasks_Refresh_Click(sender As System.Object, e As System.EventArgs) Handles cmdTasks_Refresh.Click
  131. ' lstTasks.Items.Clear()
  132. ' tv_MissingArtDownload(tv_ShowSelectedCurrently)
  133. ' For Each Item As ITask In TaskCache.Tasks
  134. ' lstTasks.Items.Add(Item)
  135. ' Next
  136. 'End Sub
  137. 'Private Sub lstTasks_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles lstTasks.SelectedIndexChanged
  138. ' If lstTasks.SelectedItem Is Nothing Then Exit Sub
  139. ' Dim SelectedTask As ITask
  140. ' SelectedTask = lstTasks.SelectedItem
  141. ' Select Case SelectedTask.State
  142. ' Case TaskState.Completed
  143. ' lblTask_State.Text = "Completed"
  144. ' Case TaskState.BackgroundWorkComplete
  145. ' lblTask_State.Text = "Background Completed"
  146. ' Case TaskState.CriticalFault
  147. ' lblTask_State.Text = "Critial Fault"
  148. ' Case TaskState.Fault
  149. ' lblTask_State.Text = "Fault"
  150. ' Case TaskState.Halted
  151. ' lblTask_State.Text = "Halted"
  152. ' Case TaskState.NotStarted
  153. ' lblTask_State.Text = "Not Started"
  154. ' Case TaskState.WaitingForUserInput
  155. ' lblTask_State.Text = "Waiting For Input"
  156. ' Case TaskState.Running
  157. ' lblTask_State.Text = "Running"
  158. ' End Select
  159. ' lblTask_Attempts.Text = SelectedTask.Attempts
  160. ' cmbTasks_Arguments.Items.Clear()
  161. ' cmbTasks_Arguments.Text = ""
  162. ' For Each Item In SelectedTask.Arguments
  163. ' cmbTasks_Arguments.Items.Add(Item)
  164. ' Next
  165. ' If cmbTasks_Arguments.Items.Count > 0 Then cmbTasks_Arguments.SelectedIndex = 0
  166. ' lstTasks_Dependancies.Items.Clear()
  167. ' For Each Item In SelectedTask.Dependancies
  168. ' lstTasks_Dependancies.Items.Add(Item)
  169. ' Next
  170. ' lstTasks_Messages.Items.Clear()
  171. ' For Each Item In SelectedTask.Messages
  172. ' lstTasks_Messages.Items.Add(Item)
  173. ' Next
  174. 'End Sub
  175. 'Private Sub lstTasks_Messages_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles lstTasks_Messages.SelectedIndexChanged
  176. ' If lstTasks_Messages.SelectedItem Is Nothing Then Exit Sub
  177. ' txtTasks_SelectedMessage.Text = lstTasks_Messages.SelectedItem
  178. 'End Sub
  179. 'Private Sub cmbTasks_Arguments_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbTasks_Arguments.SelectedIndexChanged
  180. ' If cmbTasks_Arguments.SelectedItem Is Nothing Then Exit Sub
  181. ' pnlTasks_Arguments.Controls.Clear()
  182. ' Dim Item As KeyValuePair(Of String, Object) = cmbTasks_Arguments.SelectedItem
  183. ' If TypeOf Item.Value Is String Then
  184. ' pnlTasks_Arguments.Controls.Add(New TextBox() With {.Text = Item.Value, .Dock = DockStyle.Fill, .Multiline = True, .ScrollBars = ScrollBars.Both})
  185. ' ElseIf TypeOf Item.Value Is TvShow Then
  186. ' Dim TempShow As TvShow = Item.Value
  187. ' pnlTasks_Arguments.Controls.Add(New TextBox() With {.Text = TempShow.Id.Value & " - " & TempShow.Title.Value, .Dock = DockStyle.Fill, .ScrollBars = ScrollBars.Both})
  188. ' ElseIf TypeOf Item.Value Is TvEpisode Then
  189. ' Dim TempEpisode As TvEpisode = Item.Value
  190. ' pnlTasks_Arguments.Controls.Add(New TextBox() With {.Text = TempEpisode.Id.Value & " - " & TempEpisode.Title.Value, .Dock = DockStyle.Fill, .ScrollBars = ScrollBars.Both})
  191. ' ElseIf TypeOf Item.Value Is Image Then
  192. ' pnlTasks_Arguments.Controls.Add(New PictureBox() With {.Image = Item.Value, .Dock = DockStyle.Fill})
  193. ' End If
  194. 'End Sub
  195. 'Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
  196. ' Try
  197. ' For Each Task In TaskCache.Tasks
  198. ' If Task.State = TaskState.BackgroundWorkComplete Then
  199. ' Task.FinishWork()
  200. ' End If
  201. ' Windows.Forms.Application.DoEvents()
  202. ' Next
  203. ' Catch
  204. ' End Try
  205. 'End Sub
  206. 'Private Sub ContextMenuStrip1_Opening(sender As System.Object, e As System.ComponentModel.CancelEventArgs) Handles ContextMenuStrip1.Opening
  207. 'End Sub
  208. 'Private Sub TaskListUpdater_Tick(sender As System.Object, e As System.EventArgs) Handles TaskListUpdater.Tick
  209. ' 'cmdTasks_Refresh_Click(Nothing, Nothing)
  210. ' TaskListUpdater.Enabled = False
  211. ' lstTasks.ResetText()
  212. 'End Sub