Browse Source

Теперь TreeView обновляется в реальном времени. Сокращен тикрэйт нижней информационной строки (300 ms). Удалены методы сhangeVisibilityResultViewer, updateResultViewer, updateInfoLabel.

master release_1.0.1
Никита 6 years ago
parent
commit
bf1baf17eb
  1. 74
      fileFinder/MainForm.cs
  2. 51
      fileFinder/TaskController.cs

74
fileFinder/MainForm.cs

@ -8,14 +8,16 @@ namespace fileFinder
{ {
public partial class MainForm : Form public partial class MainForm : Form
{ {
TaskController mainController = new TaskController(); TaskController mainController;
SearchQueryModel searchQueryModel; 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; bool isFieldsChanged = false;
public MainForm() public MainForm()
{ {
InitializeComponent(); InitializeComponent();
mainController = new TaskController(this, resultViewer);
this.updateInfoTimer.Elapsed += refreshInfoByTimer; this.updateInfoTimer.Elapsed += refreshInfoByTimer;
this.updateInfoTimer.AutoReset = true; this.updateInfoTimer.AutoReset = true;
this.updateInfoTimer.Enabled = true; this.updateInfoTimer.Enabled = true;
@ -64,15 +66,8 @@ namespace fileFinder
private void reportProgress(object sender, ProgressReportModel report) private void reportProgress(object sender, ProgressReportModel report)
{ {
switch (mainController.state) if (report != null)
{ lastReport = report;
case TaskState.Pause:
updateResultViewer(report.currentTreeNode);
break;
default:
updateInfoLabel(report.currentFileUrl, report);
break;
}
} }
private async void handleSearchBtn_Click(object sender, EventArgs e) private async void handleSearchBtn_Click(object sender, EventArgs e)
@ -97,14 +92,11 @@ namespace fileFinder
searchQueryModel = mainController.updateSearchQueryModel(fileUrlTextBox.Text, searchQueryModel = mainController.updateSearchQueryModel(fileUrlTextBox.Text,
nameQueryTextBox.Text, innerQueryTextBox.Text); nameQueryTextBox.Text, innerQueryTextBox.Text);
handleSearchBtn.Text = "Поставить на паузу"; handleSearchBtn.Text = "Поставить на паузу";
resultViewer.Nodes.Clear();
mainController.beginTask(); mainController.beginTask();
changeVisibilityResultViewer(); await Task.Run(() => mainController.buildResultTree(searchQueryModel, progress));
TreeNode tN = await Task.Run(() => mainController.buildResultTree(searchQueryModel, progress)); if (mainController.state == TaskState.Finished)
if (tN != null)
{
updateResultViewer(tN);
handleSearchBtn.Text = "Запустить поиск"; handleSearchBtn.Text = "Запустить поиск";
}
break; break;
case TaskState.Work: case TaskState.Work:
handleSearchBtn.Text = "Продолжить"; handleSearchBtn.Text = "Продолжить";
@ -115,46 +107,9 @@ namespace fileFinder
mainController.resumeTask(); mainController.resumeTask();
break; break;
case TaskState.Finished: case TaskState.Finished:
mainController = new TaskController(); mainController = new TaskController(this, resultViewer);
goto case TaskState.Created; 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) private void refreshInfoByTimer(object sender, ElapsedEventArgs e)
@ -162,9 +117,14 @@ namespace fileFinder
Action refresh = () => Action refresh = () =>
{ {
TimeSpan tS = mainController.elapsedTime(); 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); string time = String.Format("{0:00}:{1:00}:{2:00}", tS.Hours, tS.Minutes, tS.Seconds);
infoLabel.Text = "Время: " + time + " |" + infoLabel.Text = "Время: " + time + " " + "| Кол-во файлов: " + fileNumCounters +
infoLabel.Text.Substring(infoLabel.Text.IndexOf("|") + 1); " | Статус: " + lastReport.currentFileUrl;
}; };
try { this.Invoke(refresh); } catch { } try { this.Invoke(refresh); } catch { }
} }

51
fileFinder/TaskController.cs

@ -15,9 +15,13 @@ namespace fileFinder
{ {
private Stopwatch stopwatch = new Stopwatch(); private Stopwatch stopwatch = new Stopwatch();
public TaskState state { get; private set; } 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; state = TaskState.Created;
} }
@ -50,13 +54,12 @@ namespace fileFinder
return stopwatch.Elapsed; return stopwatch.Elapsed;
} }
public async Task<TreeNode> buildResultTree(SearchQueryModel query, IProgress <ProgressReportModel> report) public async void buildResultTree(SearchQueryModel query, IProgress <ProgressReportModel> report)
{ {
TaskController controller = this; TaskController controller = this;
TreeNode itemsNode = new TreeNode(); report.Report(createReport("Индексирование заданного пути", 0, 0, 0));
report.Report(createReport(null, "Индексирование заданного пути", 0, 0, 0));
List<string> foundFiles = getFileList(query.fileUrl, query.fileNameQuery); List<string> 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; int matchingFiles = 0, processedFiles = 0;
foreach (string item in foundFiles) foreach (string item in foundFiles)
@ -64,34 +67,33 @@ namespace fileFinder
switch (state) switch (state)
{ {
case TaskState.Finished: case TaskState.Finished:
return null; return;
case TaskState.Pause: case TaskState.Pause:
report.Report(createReport((TreeNode)itemsNode.Clone(), report.Report(createReport(item, matchingFiles, processedFiles, foundFiles.Count));
item, matchingFiles, processedFiles, foundFiles.Count));
while (state == TaskState.Pause) while (state == TaskState.Pause)
Thread.Sleep(100); Thread.Sleep(100);
goto case TaskState.Work; goto case TaskState.Work;
case TaskState.Work: case TaskState.Work:
string[] fileLines = getFileContents(item); 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))) if ((fileLines.Length > 0) && (isFileContainQuery(fileLines, query.fileInnerQuery)))
{ {
await fillChildNode(itemsNode, item.Replace(query.fileUrl, "")); await fillChildNode(currentView.Nodes, item.Replace(query.fileUrl, ""));
matchingFiles++; matchingFiles++;
} }
processedFiles++; processedFiles++;
break; break;
} }
} }
report.Report(createReport(null, "none", matchingFiles, processedFiles, foundFiles.Count)); report.Report(createReport("none", matchingFiles, processedFiles, foundFiles.Count));
controller.stopTask(); 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(); ProgressReportModel prm = new ProgressReportModel();
prm.currentTreeNode = treeNode;
prm.currentFileUrl = fileUrl; prm.currentFileUrl = fileUrl;
prm.matchingFiles = matchingFiles; prm.matchingFiles = matchingFiles;
prm.processedFiles = processedFiles; prm.processedFiles = processedFiles;
@ -135,13 +137,17 @@ namespace fileFinder
return false; return false;
} }
public async Task fillChildNode(TreeNode node, String item) public async Task fillChildNode(TreeNodeCollection node, String item)
{ {
int backSlashIndex = item.IndexOf("\\"); int backSlashIndex = item.IndexOf("\\");
switch (backSlashIndex) switch (backSlashIndex)
{ {
case -1: case -1:
node.Nodes.Add(item, item, 2, 2); Action refresh = () =>
{
node.Add(item, item, 2, 2);
}; try { form.Invoke(refresh); } catch { }
break; break;
case 0: case 0:
item = item.Remove(0, 1); item = item.Remove(0, 1);
@ -149,15 +155,18 @@ namespace fileFinder
break; break;
default: default:
String currentNodeName = item.Substring(0, backSlashIndex); String currentNodeName = item.Substring(0, backSlashIndex);
int nodeIndex = node.Nodes.IndexOfKey(currentNodeName); int nodeIndex = node.IndexOfKey(currentNodeName);
if (nodeIndex != -1) if (nodeIndex != -1)
await fillChildNode(node.Nodes[nodeIndex], item.Remove(0, backSlashIndex + 1)); await fillChildNode(node[nodeIndex].Nodes, item.Remove(0, backSlashIndex + 1));
else else
{ {
node.Nodes.Add(currentNodeName, currentNodeName, 0, 0); Action refresh2 = () =>
nodeIndex = node.Nodes.IndexOfKey(currentNodeName); {
await fillChildNode(node.Nodes[nodeIndex], item.Remove(0, backSlashIndex + 1)); 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; break;
} }

Loading…
Cancel
Save