static void Main(string[] args) { //string[] fileList = Directory.GetFiles(".", "*.png"); //int threadsMaxCount = Environment.ProcessorCount; //PNGCompMT.CompressMT(fileList, threadsMaxCount); //Console.WriteLine("\nAll compressed. \nPress Enter to quit."); //Console.ReadLine(); //Image image = Image.FromFile("test.png"); //image.Save("test1.png", ImageFormat.Png); PNGComp pngComp = new PNGComp("main.vpy - 13576.png", "backup/main.vpy - 13576.png"); pngComp.Compress(false); }
static internal void CompressMT(string[] fileList, int threadsMaxCount) { for (int i = 0; i < fileList.Length; i++) { fileList[i] = Path.GetFileName(fileList[i]); } fileCount = fileList.Length; if (fileCount < threadsMaxCount) { threadsMaxCount = fileCount; } if (!Directory.Exists("backup")) { Directory.CreateDirectory("backup"); } tasks = new Task[threadsMaxCount]; Action <object> action = (object obj) => { string fileNameString = obj.ToString(); string fileTempNameString = "temp." + fileNameString; PNGComp pngComp = new PNGComp(fileNameString, fileTempNameString); pngComp.Compress(false); FileInfo fileInfo = new FileInfo(fileNameString); fileInfo.MoveTo("backup/" + fileNameString); fileInfo = new FileInfo(fileTempNameString); fileInfo.MoveTo(fileNameString); }; Console.WriteLine("Compressing {0:D} .png files......", fileCount); for (i = 0; i < fileCount; i++) { if (i < threadsMaxCount) { tasks[i] = new Task(action, fileList[i]); tasks[i].Start(); } else { j = Task.WaitAny(tasks); tasks[j] = new Task(action, fileList[i]); tasks[j].Start(); } } Task.WaitAll(tasks); }