private static void addCompletedTask(CompressionTask task)
 {
     lock (m_completedTask)
     {
         m_completedTask.Add(task.Id, task);
     }
 }
 public static void ExecuteTask(CompressionTask task)
 {
     lock (m_tasks)
     {
         m_tasks.Enqueue(task);
         Monitor.Pulse(m_tasks);
     }
 }
Ejemplo n.º 3
0
 public virtual void Handle(CompressionTask task)
 {
     if (task.Exception == null)
     {
         m_numberOutputBytes += task.ResultData.Length;
         //Console.WriteLine($"completed task: {task.Id}, block: {task.ResultData.Length}");
         m_outputStream.Write(task.ResultData, 0, task.ResultData.Length);
         m_outputStream.Flush();
     }
     else
     {
         throw task.Exception;
     }
 }
 private static void dataProcessing()
 {
     while (true)
     {
         CompressionTask task = null;
         lock (m_tasks)
         {
             while (m_tasks.Count == 0)
             {
                 Monitor.Wait(m_tasks);
             }
             task = m_tasks.Dequeue();
         }
         task.Execute();
         addCompletedTask(task);
     }
 }
        public static CompressionTask GetCompletedTask(int index)
        {
            CompressionTask task = null;

            lock (m_completedTask)
            {
                if (m_completedTask.ContainsKey(index))
                {
                    if (m_completedTask.TryGetValue(index, out task))
                    {
                        m_completedTask.Remove(index);
                    }
                }
            }
            if (task != null)
            {
                lock (m_tasks)
                {
                    Monitor.Pulse(m_tasks);
                    return(task);
                }
            }
            return(null);
        }
Ejemplo n.º 6
0
        public void Execute(CompressionMode mode, string sourceFileName, string targetFileName)
        {
            CompressionTaskResultHandler taskResultHandler = null;
            Exception exception = null;

            try
            {
                using (FileStream inputStream = new FileStream(sourceFileName, FileMode.Open, FileAccess.Read))
                {
                    long offsetBytes = 0;
                    int  countBytes  = 0;
                    int  countTask   = 0;
                    for (countTask = 0; ; ++countTask)
                    {
                        if (inputStream.Position >= inputStream.Length)
                        {
                            break;
                        }
                        if (mode == CompressionMode.Compress)
                        {
                            countBytes = checked ((int)calculateSizeBlock(inputStream.Length - offsetBytes));
                        }
                        else
                        {
                            byte[] sizeBlock = new byte[m_sizeBlockSize];
                            inputStream.Read(sizeBlock, 0, m_sizeBlockSize);
                            offsetBytes += m_sizeBlockSize;
                            countBytes   = BitConverter.ToInt32(sizeBlock, 0);
                        }

                        CompressionTask task = new CompressionTask(countTask, mode, sourceFileName, countBytes, offsetBytes);
                        CustomFixedThreadPool.ExecuteTask(task);
                        //Console.WriteLine($"process part {i} bytes from {offsetBytes} to {offsetBytes + countBytes} ({countBytes}), all {inputStream.Length} bytes");
                        offsetBytes += countBytes;
                        inputStream.Seek(countBytes, SeekOrigin.Current);
                    }
                    //Console.WriteLine($"pos:{inputStream.Length}, length: {inputStream.Length}");

                    taskResultHandler = new CompressionTaskResultHandler(targetFileName);
                    int completedTask = 0;
                    while (completedTask != countTask)
                    {
                        CompressionTask task = CustomFixedThreadPool.GetCompletedTask(completedTask);
                        if (task == null)
                        {
                            Thread.Sleep(5);
                        }
                        else
                        {
                            taskResultHandler.Handle(task);
                            task.Dispose();
                            completedTask++;
                        }
                    }
                    Console.WriteLine($"Size source file: {inputStream.Length} bytes");
                    Console.WriteLine($"Size target file: {taskResultHandler.NumberOutputBytes} bytes");
                    Console.WriteLine($"Start task: {countTask}, completed task: {completedTask}");
                }
            }
            catch (Exception externException)
            {
                exception = externException;
            }
            finally
            {
                if (taskResultHandler != null)
                {
                    taskResultHandler.Dispose();
                }
                if (exception != null)
                {
                    throw exception;
                }
            }
        }