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
{
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 { }
}

51
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<TreeNode> buildResultTree(SearchQueryModel query, IProgress <ProgressReportModel> report)
public async void buildResultTree(SearchQueryModel query, IProgress <ProgressReportModel> report)
{
TaskController controller = this;
TreeNode itemsNode = new TreeNode();
report.Report(createReport(null, "Индексирование заданного пути", 0, 0, 0));
report.Report(createReport("Индексирование заданного пути", 0, 0, 0));
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;
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;
}

Loading…
Cancel
Save