From bf1baf17eb1c53be7cbbbf31644d00c457a3406c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0?= Date: Tue, 9 Oct 2018 01:04:27 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20TreeView?= =?UTF-8?q?=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D1=8F=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20=D0=B2=20=D1=80=D0=B5=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE?= =?UTF-8?q?=D0=BC=20=D0=B2=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8.=20=D0=A1?= =?UTF-8?q?=D0=BE=D0=BA=D1=80=D0=B0=D1=89=D0=B5=D0=BD=20=D1=82=D0=B8=D0=BA?= =?UTF-8?q?=D1=80=D1=8D=D0=B9=D1=82=20=D0=BD=D0=B8=D0=B6=D0=BD=D0=B5=D0=B9?= =?UTF-8?q?=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=BE?= =?UTF-8?q?=D0=BD=D0=BD=D0=BE=D0=B9=20=D1=81=D1=82=D1=80=D0=BE=D0=BA=D0=B8?= =?UTF-8?q?=20(300=20ms).=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D1=8B=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D1=8B=20=D1=81hangeVisibilityRes?= =?UTF-8?q?ultViewer,=20updateResultViewer,=20updateInfoLabel.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fileFinder/MainForm.cs | 74 +++++++++--------------------------- fileFinder/TaskController.cs | 51 +++++++++++++++---------- 2 files changed, 47 insertions(+), 78 deletions(-) diff --git a/fileFinder/MainForm.cs b/fileFinder/MainForm.cs index 72f8aaa..6802df3 100644 --- a/fileFinder/MainForm.cs +++ b/fileFinder/MainForm.cs @@ -8,14 +8,16 @@ namespace fileFinder { public partial class MainForm : Form { - TaskController mainController = new TaskController(); + TaskController mainController; SearchQueryModel searchQueryModel; - System.Timers.Timer updateInfoTimer = new System.Timers.Timer(1000); + System.Timers.Timer updateInfoTimer = new System.Timers.Timer(300); + ProgressReportModel lastReport = null; bool isFieldsChanged = false; public MainForm() { InitializeComponent(); + mainController = new TaskController(this, resultViewer); this.updateInfoTimer.Elapsed += refreshInfoByTimer; this.updateInfoTimer.AutoReset = true; this.updateInfoTimer.Enabled = true; @@ -64,15 +66,8 @@ namespace fileFinder private void reportProgress(object sender, ProgressReportModel report) { - switch (mainController.state) - { - case TaskState.Pause: - updateResultViewer(report.currentTreeNode); - break; - default: - updateInfoLabel(report.currentFileUrl, report); - break; - } + if (report != null) + lastReport = report; } private async void handleSearchBtn_Click(object sender, EventArgs e) @@ -97,14 +92,11 @@ namespace fileFinder searchQueryModel = mainController.updateSearchQueryModel(fileUrlTextBox.Text, nameQueryTextBox.Text, innerQueryTextBox.Text); handleSearchBtn.Text = "Поставить на паузу"; + resultViewer.Nodes.Clear(); mainController.beginTask(); - changeVisibilityResultViewer(); - TreeNode tN = await Task.Run(() => mainController.buildResultTree(searchQueryModel, progress)); - if (tN != null) - { - updateResultViewer(tN); + await Task.Run(() => mainController.buildResultTree(searchQueryModel, progress)); + if (mainController.state == TaskState.Finished) handleSearchBtn.Text = "Запустить поиск"; - } break; case TaskState.Work: handleSearchBtn.Text = "Продолжить"; @@ -115,46 +107,9 @@ namespace fileFinder mainController.resumeTask(); break; case TaskState.Finished: - mainController = new TaskController(); + mainController = new TaskController(this, resultViewer); goto case TaskState.Created; } - changeVisibilityResultViewer(); - } - - private void changeVisibilityResultViewer() - { - switch (mainController.state) - { - case TaskState.Work: // если задание в работе, то блокируем ResultViewer - waitOrPauseLabel.Visible = true; - resultViewer.Enabled = false; - break; - case TaskState.Pause: // если задание на паузе, то показываем промеж. результат - waitOrPauseLabel.Visible = false; - resultViewer.Enabled = true; - break; - case TaskState.Finished: // если задание завершено, то показываем результат - goto case TaskState.Pause; - } - } - - private void updateInfoLabel(string fileUrl, ProgressReportModel rpm) - { - TimeSpan tS = mainController.elapsedTime(); - string fileNumCounters = rpm.matchingFiles + "/" + rpm.processedFiles + "/" + rpm.totalNumOfFiles; - string time = String.Format("{0:00}:{1:00}:{2:00}", tS.Hours, tS.Minutes, tS.Seconds); - infoLabel.Text = "Время: " + time + " " + "| Кол-во файлов: " + fileNumCounters + - " | Статус: " + fileUrl; - - } - - private void updateResultViewer(TreeNode tN) - { - if (tN != null) - { - resultViewer.Nodes.Clear(); - resultViewer.Nodes.Add(tN); - } } private void refreshInfoByTimer(object sender, ElapsedEventArgs e) @@ -162,9 +117,14 @@ namespace fileFinder Action refresh = () => { TimeSpan tS = mainController.elapsedTime(); + + string fileNumCounters = lastReport.matchingFiles + "/" + lastReport.processedFiles + + "/" + lastReport.totalNumOfFiles; + string time = String.Format("{0:00}:{1:00}:{2:00}", tS.Hours, tS.Minutes, tS.Seconds); - infoLabel.Text = "Время: " + time + " |" + - infoLabel.Text.Substring(infoLabel.Text.IndexOf("|") + 1); + infoLabel.Text = "Время: " + time + " " + "| Кол-во файлов: " + fileNumCounters + + " | Статус: " + lastReport.currentFileUrl; + }; try { this.Invoke(refresh); } catch { } } diff --git a/fileFinder/TaskController.cs b/fileFinder/TaskController.cs index 48a7b96..da3957e 100644 --- a/fileFinder/TaskController.cs +++ b/fileFinder/TaskController.cs @@ -15,9 +15,13 @@ namespace fileFinder { private Stopwatch stopwatch = new Stopwatch(); public TaskState state { get; private set; } + private MainForm form; + private TreeView currentView; - public TaskController() + public TaskController(MainForm form, TreeView viewer) { + this.form = form; + currentView = viewer; state = TaskState.Created; } @@ -50,13 +54,12 @@ namespace fileFinder return stopwatch.Elapsed; } - public async Task buildResultTree(SearchQueryModel query, IProgress report) + public async void buildResultTree(SearchQueryModel query, IProgress report) { TaskController controller = this; - TreeNode itemsNode = new TreeNode(); - report.Report(createReport(null, "Индексирование заданного пути", 0, 0, 0)); + report.Report(createReport("Индексирование заданного пути", 0, 0, 0)); List foundFiles = getFileList(query.fileUrl, query.fileNameQuery); - report.Report(createReport(null, null, 0, 0, foundFiles.Count)); + report.Report(createReport(null, 0, 0, foundFiles.Count)); int matchingFiles = 0, processedFiles = 0; foreach (string item in foundFiles) @@ -64,34 +67,33 @@ namespace fileFinder switch (state) { case TaskState.Finished: - return null; + return; case TaskState.Pause: - report.Report(createReport((TreeNode)itemsNode.Clone(), - item, matchingFiles, processedFiles, foundFiles.Count)); + report.Report(createReport(item, matchingFiles, processedFiles, foundFiles.Count)); while (state == TaskState.Pause) Thread.Sleep(100); goto case TaskState.Work; case TaskState.Work: string[] fileLines = getFileContents(item); - report.Report(createReport(null, item, matchingFiles, processedFiles, foundFiles.Count)); + report.Report(createReport(item, matchingFiles, processedFiles, foundFiles.Count)); if ((fileLines.Length > 0) && (isFileContainQuery(fileLines, query.fileInnerQuery))) { - await fillChildNode(itemsNode, item.Replace(query.fileUrl, "")); + await fillChildNode(currentView.Nodes, item.Replace(query.fileUrl, "")); matchingFiles++; } processedFiles++; break; } } - report.Report(createReport(null, "none", matchingFiles, processedFiles, foundFiles.Count)); + report.Report(createReport("none", matchingFiles, processedFiles, foundFiles.Count)); controller.stopTask(); - return itemsNode; } - private ProgressReportModel createReport(TreeNode treeNode, string fileUrl, int matchingFiles, int processedFiles, int totalNumOfFiles) + private ProgressReportModel createReport(string fileUrl, int matchingFiles, int processedFiles, int totalNumOfFiles) { + if (state == TaskState.Finished) + return null; ProgressReportModel prm = new ProgressReportModel(); - prm.currentTreeNode = treeNode; prm.currentFileUrl = fileUrl; prm.matchingFiles = matchingFiles; prm.processedFiles = processedFiles; @@ -135,13 +137,17 @@ namespace fileFinder return false; } - public async Task fillChildNode(TreeNode node, String item) + public async Task fillChildNode(TreeNodeCollection node, String item) { + int backSlashIndex = item.IndexOf("\\"); switch (backSlashIndex) { case -1: - node.Nodes.Add(item, item, 2, 2); + Action refresh = () => + { + node.Add(item, item, 2, 2); + }; try { form.Invoke(refresh); } catch { } break; case 0: item = item.Remove(0, 1); @@ -149,15 +155,18 @@ namespace fileFinder break; default: String currentNodeName = item.Substring(0, backSlashIndex); - int nodeIndex = node.Nodes.IndexOfKey(currentNodeName); + int nodeIndex = node.IndexOfKey(currentNodeName); if (nodeIndex != -1) - await fillChildNode(node.Nodes[nodeIndex], item.Remove(0, backSlashIndex + 1)); + await fillChildNode(node[nodeIndex].Nodes, item.Remove(0, backSlashIndex + 1)); else { - node.Nodes.Add(currentNodeName, currentNodeName, 0, 0); - nodeIndex = node.Nodes.IndexOfKey(currentNodeName); - await fillChildNode(node.Nodes[nodeIndex], item.Remove(0, backSlashIndex + 1)); + Action refresh2 = () => + { + node.Add(currentNodeName, currentNodeName, 0, 0); + }; try { form.Invoke(refresh2); } catch { } + nodeIndex = node.IndexOfKey(currentNodeName); + await fillChildNode(node[nodeIndex].Nodes, item.Remove(0, backSlashIndex + 1)); } break; }