Възприех по-ориентиран подход, който може да е по-икономичен, що се отнася до таймерите, но има много прост интерфейс. Ядрото е TaskItem, който проследява работата и времето, след това клас за събиране, за да ги изложи, стартира и спре. Чрез погребване на възможно най-много функционалност на възможно най-ниско ниво нещата стават по-прости.
Използвах само един таймер и не разбирам защо имате нужда от няколко таймера за една задача. Ако TaskItem записва DateTime
, когато стартира (това се случва автоматично, когато е създаден в моя), тогава изобщо не се нуждаете от таймери. Изминалите винаги се изчисляват с помощта на StartedTime
и DateTime.Now
(за изпълнявана задача) или CompletedTime
за завършени задачи. Не виждам къде таймерът добавя нещо.
Ще трябва да направите много модификации за вашите цели. Това не запазва завършени елементи, нито ги премахва от списъка, но може да ви даде откъде да започнете. Това също е нещо за първо преминаване; със сигурност има проблеми тук и там.
Imports System.Collections.ObjectModel
Public Class Tasks
' slight overkill
Private Enum LVGroups
Running
Completed
End Enum
Public Enum TaskJobs
SweepFloor
BuildRobot
CleanOven
RepairRobot
EmptyTrash
TeachRobotToTalk
MakeCoffee
TeachRobotToWalk
WashDishes
TeachRobotVisualBasic
End Enum
' class for a single task
Public Class TaskItem
' these ought to be readonly; so no cheating
Public Property ID As String
Public Property EmpName As String
Public Property StartedTime As DateTime
Public Property CompletedTime As DateTime
' or job code...
Public Property Job As TaskJobs
' put in a ClassLib or Namespace
Friend Sub New(sName As String, tj As TaskJobs)
EmpName = sName
Job = tj
StartedTime = DateTime.Now
CompletedTime = DateTime.MaxValue
ID = System.Guid.NewGuid.ToString
End Sub
Public Function IsActive() As Boolean
Return (CompletedTime = DateTime.MaxValue)
End Function
Public Sub EndTask()
CompletedTime = DateTime.Now
End Sub
Public Function GetElapsed() As String
Dim t As TimeSpan
If IsActive() Then
t = DateTime.Now - StartedTime
Else
t = CompletedTime - StartedTime
End If
Return String.Format("{0:00}:{1:00}:{2:00}", Math.Floor(t.TotalHours),
t.Minutes, t.Seconds)
End Function
Public Overrides Function ToString() As String
Return String.Format("{0} {1} {2}", EmpName, Job.ToString, GetElapsed)
End Function
End Class
Private col As Collection(Of TaskItem)
Private myLV As ListView
' assign the LV when tasks are created
Public Sub New(lvTask As ListView)
myLV = lvTask
col = New Collection(Of TaskItem)
End Sub
' add new task with EmpName and JobCode
Public Sub NewTask(sName As String, tj As TaskJobs)
Dim ti As New TaskItem(sName, tj)
col.Add(ti)
' LV layout: empname, job, elapsed, ID
' but only 3 columns so that ID is "hidden"
Dim lvi As New ListViewItem(ti.EmpName)
lvi.SubItems.Add(ti.Job.ToString)
lvi.SubItems.Add(ti.GetElapsed)
lvi.SubItems.Add(ti.ID)
lvi.Group = myLV.Groups(LVGroups.Running.ToString)
myLV.Items.Add(lvi)
End Sub
' called from dbl click on a running task item
Public Sub StopTask(lvi As ListViewItem)
Dim ti As TaskItem = (From t In col Where t.ID = lvi.SubItems(3).Text).First
' the form doesnt check the status, so we must
If ti.IsActive Then
ti.EndTask()
lvi.Group = myLV.Groups(LVGroups.Completed.ToString)
End If
End Sub
' called from the form timer tick event
Public Sub UpdateDisplay()
Dim ti As TaskItem
' iterate items to get ID of runners
For Each lvi As ListViewItem In myLV.Groups(LVGroups.Running.ToString).Items
' ToDo add error checking
ti = (From t In col Where t.ID = lvi.SubItems(3).Text).First
lvi.SubItems(2).Text = ti.GetElapsed
Next
End Sub
Public Function RunnersCount() As Integer
Return GetActiveList.Count
End Function
Public Function GetCompletedList() As List(Of TaskItem)
' long form
Dim tList As New List(Of TaskItem)
For Each ti As TaskItem In col
If ti.IsActive = False Then
tList.Add(ti)
End If
Next
Return tList
' short form
'Dim list = (From t In col Where t.IsActive = False).ToList
End Function
Public Function GetActiveList() As List(Of TaskItem)
' long form
'Dim tList As New List(Of TaskItem)
'For Each ti As TaskItem In col
' If ti.IsActive Then
' tList.Add(ti)
' End If
'Next
'Return tList
' short form
Dim list = (From t In col Where t.IsActive).ToList
Return list
End Function
End Class
Употреба:
Public Class Form1
Private myTasks As Tasks
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
myTasks = New Tasks(Me.lvTask)
cboTask.Items.AddRange([Enum].GetNames(GetType(Tasks.TaskJobs)))
End Sub
Добавете задача:
myTasks.NewTask(cboEmp.Text, CType(cboTask.SelectedIndex, Tasks.TaskJobs))
Спиране на задача:
' called from LV mousedoubleclick, so determine the item
Dim lvi As ListViewItem = lvTask.GetItemAt(e.X, e.Y)
myTasks.StopTask(lvi)
Очевидно спирането на задача може автоматично да добави данните към файла за експортиране. Тази функционалност ще бъде в класа за събиране на задачи, където ще бъде направено точно преди задачата да бъде премахната от колекцията (по избор - те не нараняват нищо там, стига да различите активните от завършените).
Таймер Тик събитие:
myTasks.UpdateDisplay()
![въведете описание на изображението тук](https://i.stack.imgur.com/wE9Oj.jpg)
И накрая, включете Option Strict
, особено след като хората ще вземат решения въз основа на резултатите от проекта.
person
Ňɏssa Pøngjǣrdenlarp
schedule
10.10.2014