Inheritance: CmdletWorker
示例#1
0
 public void Deactivate(bool forward)
 {
     if (!forward)
     {
         if (CompressWorker.IsBusy)
         {
             CompressWorker.CancelAsync();
         }
         DiscardArchive();
     }
 }
示例#2
0
        public void SetProgress(long inSize, long outSize)
        {
            // Called every 100 milliseconds
            int permille = (int)(Math.Round(1000.0 * inSize / totalLogSize));

            if (permille > 1000)
            {
                permille = 1000;
            }
            CompressWorker.ReportProgress(permille, new ProgressInfo {
                CompressedSize = outSize
            });
        }
示例#3
0
        public void Activate(bool forward)
        {
            if (forward)
            {
                dataReady = false;
                if (!CompressWorker.IsBusy)
                {
                    CompressWorker.RunWorkerAsync();
                }
                else
                {
                    MessageBox.Show(
                        Tx.T("msg.previous operation"),
                        Tx.T("msg.title.error"),
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error);
                }
            }

            UpdateButtons();
        }
示例#4
0
        private void CompressWorker_DoWork(object sender, DoWorkEventArgs args)
        {
            try
            {
                // Quickly set the UI state
                CompressWorker.ReportProgress(0, new ProgressInfo {
                    CompressedSize = 0
                });

                // Collect all data
                DateTime minTime = DateTime.MinValue;
                if (SharedData.Instance.LogTimeSpan != TimeSpan.MaxValue)
                {
                    minTime = SharedData.Instance.LastLogUpdateTime - SharedData.Instance.LogTimeSpan;
                }
                string        notes        = SharedData.Instance.Notes;
                string        eMailAddress = SharedData.Instance.EMailAddress;
                List <string> logFiles     = new List <string>();
                totalLogSize = 0;
                long processedLogSize = 0;
                foreach (string basePath in SharedData.Instance.LogBasePaths)
                {
                    string dir              = Path.GetDirectoryName(basePath);
                    string baseName         = Path.GetFileName(basePath);
                    var    interestingFiles =
                        Directory.GetFiles(dir, baseName + "-?-*.fl")
                        .Concat(Directory.GetFiles(dir, baseName + "-scr-*.png"))
                        .Concat(Directory.GetFiles(dir, baseName + "-scr-*.jpg"));
                    foreach (string logFile in interestingFiles)
                    {
                        FileInfo fi = new FileInfo(logFile);
                        if (fi.LastWriteTimeUtc >= minTime)
                        {
                            logFiles.Add(logFile);
                            totalLogSize += fi.Length;
                        }
                    }
                }

                if (logFiles.Count == 0)
                {
                    throw new Exception(Tx.T("msg.no log files selected"));
                }

                InitializeArchive();

                if (!string.IsNullOrWhiteSpace(notes))
                {
                    using (var notesStream = new MemoryStream())
                        using (var writer = new StreamWriter(notesStream, Encoding.UTF8))
                        {
                            writer.Write(notes);
                            writer.Flush();
                            notesStream.Seek(0, SeekOrigin.Begin);
                            AddFile(notesStream, "notes.txt", DateTime.UtcNow);
                        }
                }

                if (!string.IsNullOrWhiteSpace(eMailAddress))
                {
                    using (var eMailStream = new MemoryStream())
                        using (var writer = new StreamWriter(eMailStream, Encoding.UTF8))
                        {
                            writer.Write("[InternetShortcut]\r\nURL=mailto:");
                            writer.Write(eMailAddress);
                            writer.Flush();
                            eMailStream.Seek(0, SeekOrigin.Begin);
                            AddFile(eMailStream, "email.url", DateTime.UtcNow);
                        }
                }

                EnsureDirectory("log/");
                foreach (string logFile in logFiles)
                {
                    if (CompressWorker.CancellationPending)
                    {
                        args.Cancel = true;
                        return;
                    }

                    FileInfo fi = new FileInfo(logFile);

                    AddFile(logFile, "log/" + Path.GetFileName(logFile));

                    processedLogSize += fi.Length;
                    //int percent = (int) (Math.Round(100.0 * processedLogSize / totalLogSize));
                    //CompressWorker.ReportProgress(percent, new ProgressInfo { CompressedSize = gzFile.Length });
                }

                if (CompressWorker.CancellationPending)
                {
                    args.Cancel = true;
                    return;
                }

                CloseArchive();

                CompressArchive();

                FileInfo archiveInfo = new FileInfo(archiveFileName2);
                CompressWorker.ReportProgress(1000, new ProgressInfo {
                    CompressedSize = archiveInfo.Length
                });
            }
            catch (ObjectDisposedException)
            {
                // We're leaving, don't do anything more.
                // Somehow this isn't caught by the BackgroundWorker management.
                return;
            }
        }
示例#5
0
        /// <summary>
        ///     Начинает процесс обработки файла
        /// </summary>
        public void Run()
        {
            var sw = new Stopwatch();

            sw.Start();
            //Создаем поток чтения
            var r = new Reader(0);

            _readerThread = new Thread(() => r.Read(_parameters.Operation, _parameters.InputFile, Constants.ChunkSize))
            {
                Name     = "ReaderThread",
                Priority = ThreadPriority.AboveNormal
            };
            //Создаем поток записи
            var w = new Writer();

            _writerThread = new Thread(() => w.Write(_parameters.OutputFile))
            {
                Name     = "WriterThread",
                Priority = ThreadPriority.AboveNormal
            };

            _memoryCheckThread = new Thread(() => GCUtils.RuntimeCheck(Constants.MinMemoryFreeMb));
            _memoryCheckThread.Start();
            //Запускаем чтение и запись
            _readerThread.Start();
            _writerThread.Start();
            //Console.WriteLine("Reader and Writer Started");
            var totalTasks = 0;

            //Пока все не считано и не записано
            while (!Writer.FileWrited || !Reader.FileReaded)
            {
                //проверяем на прерывание
                if (_isTerminated)
                {
                    lock (_lock)
                    {
                        for (var i = _pool.Count - 1; i >= 0; i--)
                        {
                            if (!_pool[i].IsAlive)
                            {
                                _pool[i].Abort();
                            }
                            _pool.RemoveAt(i);
                        }
                    }
                    break;
                }
                //Если весь пул занят
                lock (_lock)
                {
                    if (_pool.Count == _processorCount)
                    {
                        //Проверяем, все ли потоки работают
                        if (_pool.All(th => th.IsAlive))
                        {
                            continue;
                        }
                        //Если не все, то убираем отработавшие
                        for (var i = _pool.Count - 1; i >= 0; i--)
                        {
                            if (!_pool[i].IsAlive)
                            {
                                _pool.RemoveAt(i);
                            }
                        }
                    }
                }
                //Когда есть свободные места, создаем новый поток
                IWorker worker;
                if (_parameters.Operation == OperationCode.Compress)
                {
                    worker = new CompressWorker();
                }
                else
                {
                    worker = new DecompressWorker();
                }
                totalTasks++;
                var thr = new Thread(() => worker.DoWork())
                {
                    Name     = "Worker" + totalTasks,
                    Priority = ThreadPriority.AboveNormal
                };
                lock (_lock)
                {
                    _pool.Add(thr);
                }
                thr.Start();
            }
            sw.Stop();
            MessageSystem.AddMessage(!_isTerminated
                ? $"Операция выполнена за {sw.Elapsed.TotalSeconds:F2} секунд"
                : $"Операция прервана после {sw.Elapsed.TotalSeconds:F2} секунд");
        }