Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Многопоточность????

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

IRagnarok

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мне недавно выслали задание написать архиватор. Один из пунктов задания был:
"Программа должна работать эффективно в многопроцессорной среде и уметь обрабатывать файлы, размер которых превышает объем доступной оперативной памяти."
 
я написал программу архивации и применил код для создание фонового потока и запускал его(этот метод архивирует файл)
 
            Thread t = new Thread(delegate(){Compress(args[1], newFileName);});
            t.Start();
мне написали:
"Задача не решена. Формально не выполнено требование об эффективной работе в многопоточной среде.
Подсказка: современные процессоры состоят из нескольких ядер, и могут одновременно и параллельно выполнять несколько задач."
 
лазил по простором наткнулся на backgroundWorker. при том что запускаю его и он работает вроде как :
 
 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
         
                Compress(Переменные.путь, Переменные.имя);
           
        }
 
  public static void Compress(string filename, string name)
        {
            FileStream originalFileStream = File.OpenRead(filename);
            FileStream compressedFileStream = File.Create(name + ".zip");
            GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionMode.Compress);
 
            try
            {
                int value = originalFileStream.ReadByte();
                while (value != -1)
                {
                    compressionStream.WriteByte((byte)value);
                    value = originalFileStream.ReadByte();
                }
            }
            finally
            {
                compressionStream.Dispose();
            }
 
  private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                System.Console.WriteLine(0);
            }
            else
            {
                System.Console.WriteLine(1);
            }
            this.Close();
        }
 
 
Но как только он начинает писать в файл в методе Compress, то сам завершается, при этом он не выдаёт ни сообшение о том что он закончил ни об ошибке. просто перестаёт работать и программа закрывается. что за прикол? может мне кто то посоветует по другому сделать многопоточное программирование?. Заранее спасибо если кому то будет интересно вникнуть в эту хрень))))В тем более мне надо сделать в консольном приложении, так как потом по окончании мне надо послать сообщение в командную строку, чего никак не получается у меня из формового приложения

Всего записей: 12 | Зарегистр. 26-04-2013 | Отправлено: 23:56 07-09-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
IRagnarok

Цитата:
может мне кто то посоветует по другому сделать многопоточное программирование?

разбиваете файл на куски, запускаете по процессу на ядро, каждый будет архивировать свой кусок, потом объединяете все в один файл.

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 00:15 08-09-2013
IRagnarok

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
разбиваете файл на куски, запускаете по процессу на ядро, каждый будет архивировать свой кусок, потом объединяете все в один файл.  
 

 
можно поподробней примерный код? я не ленивый я просто на словах не очень понимаю, мне легче код разбирать)
 
Добавлено:
я разобрался уже со многим, мне нужно узнать. как кинуть выполнение какого-либо метода на ядро которое я выберу?

Всего записей: 12 | Зарегистр. 26-04-2013 | Отправлено: 19:24 08-09-2013
A_V

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
как кинуть выполнение какого-либо метода на ядро которое я выберу

можно, только не метода, а треда, см SetThreadAffinityMask
только обычно это не оправдано, можно создать просто кол-во тредов равное числу ядер (Environment.ProcessorCount), пусть ОС сама их раскидывет, как ей удобней

Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 11:59 09-09-2013
IRagnarok

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
спасибо)есть ещё маленький вопрос, у меня получилось сжать, но разжать проблемка. вот код:
 
dataArray[(int)i]-это массив байтов
 compressedDataArray[(int)i] - то, куда надо закинуть разжёванную информацию
 
MemoryStream output = new MemoryStream(dataArray[(int)i].Length);
            GZipStream cs = new GZipStream(output, CompressionMode.Decompress);
            using (MemoryStream memoryStream = new MemoryStream())
            {
                cs.CopyTo(memoryStream);
                compressedDataArray[(int)i] = memoryStream.ToArray();
           
            }
 
но он не разжимает код. знает кто в чём проблема?

Всего записей: 12 | Зарегистр. 26-04-2013 | Отправлено: 22:34 09-09-2013 | Исправлено: IRagnarok, 22:35 09-09-2013
A_V

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
IRagnarok
и где тут запись данных в output из dataArray?

Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 08:49 10-09-2013
IRagnarok

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот сделал
 
   MemoryStream originalFileStream = new MemoryStream(dataArray[(int)i]);
                MemoryStream decompressedFileStream = new MemoryStream(decompressedDataArray[(int)i].Length);
                GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress);
 
                using (GZipStream gzStream = new GZipStream(originalFileStream, CompressionMode.Decompress, true))
                {
                    const int bufferSize = 4096;
                    int bytesRead = 0;
 
                    byte[] buffer = new byte[bufferSize];
 
                    using (MemoryStream ms = new MemoryStream())
                    {
                        while ((bytesRead = gzStream.Read(buffer, 0, bufferSize)) > 0)
                        {
                            decompressedFileStream.Write(buffer, 0, bytesRead);
                        }
                       
                    }
                     
                }
 
пишет "ссылка не объект не указывает на экземпляр объекта"

Всего записей: 12 | Зарегистр. 26-04-2013 | Отправлено: 11:45 10-09-2013
A_V

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
IRagnarok
не имея всего кода, сложно сказать. может в decompressedDataArray[(int)i] лежит null, а не инициализированный byte[].
на какой строке хотя-бы падает?  

Всего записей: 770 | Зарегистр. 07-04-2002 | Отправлено: 14:45 10-09-2013 | Исправлено: A_V, 14:45 10-09-2013
blade37rus

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подробнее...
 
Добавлено:
Странное какое-то сообщение получилось.

Всего записей: 1 | Зарегистр. 04-09-2013 | Отправлено: 12:51 16-09-2013 | Исправлено: blade37rus, 12:52 16-09-2013
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Многопоточность????


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru