1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Кодерский уголок

Тема в разделе "Мастерская", создана пользователем Dimouse, 10 сен 2006.

  1. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.045
    В соответствии с назначением раздела, в этой теме предполагается обсуждать конкретные вопросы, которые у вас возникают при создании своих программ (в частности - игр), помогать другим, размещать полезные ссылки на статьи и материалы, которые могут пригодиться другим.

    Что здесь не допускается:
    - беспорядочный флуд на всевозможные темы, в том числе общие обсуждения языков программирования без конкретики (карается по статье "флуд и оффтопик" *),
    - разжигания на темы "что лучше, Си или Си++ и чем они отличаются?", "какой язык программирования лучше X или Y?" и т.п. (карается по статье "флейм и участие в холиварах" *),
    - мерение пиписьками в стиле "я лучше программирую" или "ты не умеешь программировать" (карается по статье "оскорбление участников и их взглядов" *).

    Всё это допускается в специально созданной теме "Беседка для программистов или «Бутерброд с кодом».

    * по усмотрению модератора также возможно применение блокировки в данной теме.

    Оригинальное сообщение
     
    Последнее редактирование модератором: 24 ноя 2014
    CY8R4Y нравится это.
  2.  
  3. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    Это все внутренняя имплементация метода read, и я никак там поиграться не могу. Как я писал выше, я присобачил воркэраунд, в виде буфера в локальной памяти. Процесс чтения, само собой, будет дольше, но, вроде, работает.

    Только целиком. Это midi файл. Если б он состоял из одного трека, можно было б подумать о подкачке. Но он может состоять из многих треков, в таком случае мне придется прыгать по всему файлу туда-сюда, что неприемлемо для подкачки при воспроизведении музыки.
     
  4. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Дык, читай используя read по кускам, копируй куски в большой буфер.
     
  5. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    А я про что писал?! Причем два раза:

    Мне просто интересно стало, че по-людски не работает.
     
  6. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Zelya, а, блин, ну так и надо. Это нормально, ВСЕ так делают/ли. =)
    Это, кстати, ваще не отражается на производительности.
     
    Последнее редактирование: 8 авг 2014
  7. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    Как не отражатеся?! Я сначала читаю данные в одно место в памяти, а потом копирую в другое, да еще и в другом секторе. Лишний шаг "налицо"
     
  8. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Zelya, ты же не делаешь это, так сказать, per frame? Такие вещи грузятся, грубо говоря, "в начале уровня". А если файл будет внушительного размера и ты передашь загрузку мифической системной "readBigFileInstantly", то пауза один хрен будет.
     
    Последнее редактирование: 8 авг 2014
  9. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    Но почему бы мифической readBigFileInstantly не писать данные сразу в любой сгемнет?
    Я получил длинный указатель после GlobalLock , передал его внутрь readBigFileInstantly, и вперед. Инкризай offset-ы, переходи по сегментам, не жизнь, а малина, и лишнего цикла не надо.
     
  10. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Даже системная функция читала бы только кусками и цикл всё равно был бы.
     
  11. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    Ну и пусть читает кусками, главное чтобы писала сразу в глобальную память.
    А то сейчас я сначала читаю из файла в локальную, а потом из локальной пишу в глобальную: два цикла вместо одного.
     
  12. netsky2004

    netsky2004

    Регистрация:
    31 янв 2007
    Сообщения:
    1.443
    Теперь столкнулся с уже неустранимой проблемой. Удаление данных из вложенных подразделов реестра НИКАК нельзя. Вот пример скрипта:
    Код:
    private void RegistryDelete(string Section)
            {
                //Путь к разделу в реестре
                string RegistryPath;
    
                //Переменная для работы с реестром             
                RegistryKey MyRegistryKey;
    
                //Формируем путь к нашему разделу
                RegistryPath = "Software\\" + Section;
    
                //Проверяем есть ли наш раздел
                try
                {
                    MyRegistryKey = Registry.CurrentUser.OpenSubKey(RegistryPath, true);
                    if (MyRegistryKey != null)
                    {
                        //Удаляем все данные в корне раздела
                        foreach (string valueName in MyRegistryKey.GetValueNames())
                        {
                            MyRegistryKey.DeleteValue(valueName);
                        }
    
                        //Если подраздел существует, то удаляем все данные во всех вложенных подразделах
                        foreach (string subKeyName in MyRegistryKey.GetSubKeyNames())
                        {
                            using (RegistryKey tempKey = MyRegistryKey.OpenSubKey(subKeyName))
                            {
                                foreach (string valueName in tempKey.GetValueNames())
                                {
                                    tempKey.DeleteValue(valueName);
                                }
                            }
                        }
    
                        //Удаляем раздел и все вложенные подразделы
                        Registry.CurrentUser.DeleteSubKeyTree(RegistryPath);
    
                        //Выведем сообщение об успехе
                        MessageBox.Show("Параметры удалены.");
                    }
    
                    //Сохраняем значения в реестре
                    MyRegistryKey.Close();
                }
                catch (System.Exception err)
                {
                    //Если есть ошибки, то выводим сообщение с описанием этой ошибки
                    MessageBox.Show("Произошла ошибка при работе с реестром : " + err.Message);
                }
            }
    Вывод такой. Удаление можно выполнить лишь в случае отсутствии подразделов. Эта часть скрипта БЕСПОЛЕЗНА:
    Код:
     foreach (string subKeyName in MyRegistryKey.GetSubKeyNames())
                        {
                            using (RegistryKey tempKey = MyRegistryKey.OpenSubKey(subKeyName))
                            {
                                foreach (string valueName in tempKey.GetValueNames())
                                {
                                    tempKey.DeleteValue(valueName);
                                }
                            }
                        }
    ведь при входе в субкей using (RegistryKey tempKey = MyRegistryKey.OpenSubKey(subKeyName)) закрывается полностью доступ на удаление и как ни крути при попытке удаления будет ВСЕГДА сообщение об ошибке. Как удалить ключи во вложенных подразделах в C#?
     
    Последнее редактирование модератором: 9 авг 2014
  13. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Почему два цикла? Тебе надо один большой буфер и один, скажем, 4096 - для read. Плюс счётчик считанных данных. Счтал, скопировал, увеличил счётчик. Всо.

    netsky2004, используй тэг CODE для листингов.
     
  14. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    Тааакс... Зашли в "тупик". Давайте по порядку.
    У нас есть программа с данными в сегменте L (локальная память), файл с данными, скажем, размером в 32 КБ (не важно) и кусок памяти в сегменте G (глобальная память), которую мы получили GlobalAlloc
    Как мы работаем сейчас, с read.
    1. В сегменте L выделятся буффер, скажем в 1024 байта.
    2. Вызываем read и передаем туда буффер из L
    3. Внутренняя имплементация: read копирует 1024 байта в буффер (цикл 1)
    4. Мы копируем 1024 байта из буффера (L) в память G (цикл 2 - лишний!) Мы пишем данные из памяти в память, просто в другой сегмент.
    5. Возвращаемся к пункту 2. 32 раза

    Как бы могла работать гипотетическая "readBigFileInstantly"
    1. Вызываем readBigFileInstantly и передаем туда длинный указатель на паять из G
    2. Внутренняя имплементация: readBigFileInstantly копирует данные из файла сразу сразу в память из сегмента G (по длинному указателю) (цикл 1)
     
  15. netsky2004

    netsky2004

    Регистрация:
    31 янв 2007
    Сообщения:
    1.443
    Меня интересует почему нельзя удалить значение реестра, если оно находится не в корне, а во вложенных подразделах? Если значение находится в разделе, который указан в MyRegistryKey = Registry.CurrentUser.OpenSubKey(RegistryPath, true) то что будет считаться как корень, то доступ на его удаления открыт, но если есть вложенные подразделы в которых находится еще какое-нибудь значение или значение только во вложенных подразделах, то удалить его оттуда нельзя, так как при входе в подраздел
    Код:
    foreach (string subKeyName in MyRegistryKey.GetSubKeyNames())
                        {
                            using (RegistryKey tempKey = MyRegistryKey.OpenSubKey(subKeyName))
                            {
                                foreach (string valueName in tempKey.GetValueNames())
                                {
                                    tempKey.DeleteValue(valueName); [B][COLOR="Magenta"]Нельзя выполнить эту функцию. Это всегда приведет к неудаче[/COLOR][/B]
                                }
                            }
                        }
    
    доступ к значению в нем блокируется. Как снять эту блокировку?
     
  16. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Zelya, короче, не парься. А если уж очень хочется запариться, то глянь, как реализовано чтение из файла на ассемблере. Я сам не помню, но подозреваю, что там будут те же "два" цикла.
     
  17. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    Да при чем здесь это? Пусть там будет 100500 циклов, я своими же руками дописываю еще один цикл сверху. Чтобы скопировать данные из локальной памяти в глобальную.
    Я и говорю про ассемблерную имплементацию чтения, почему бы не добавить возможность писать данные в любой сегмент, а не только в локальный? Тогда каждый байт, считанный с харда, будет сразу положен в сегмент G. А не в L, а потом мною переписанный в G.
     
  18. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Zelya, мы, наверное, говорим о разных вещах. Я не понимаю просто, о чём ты беспокоишься, если лучше просто никак, кроме как писать свои функции чтения и менеджер памяти.
     
  19. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    Если уж совсем детально (полуабстрактный код):
    Сейчас так:
    А вот "фикс"


    ---------- Сообщение добавлено в 20:11 ---------- Предыдущее сообщение размещено в 20:10 ----------

    Лишний цикл беспокоит. Думал, может есть штатные методы читать сразу в глобальную память.
     
    Последнее редактирование: 8 авг 2014
  20. netsky2004

    netsky2004

    Регистрация:
    31 янв 2007
    Сообщения:
    1.443
    Как в С# удалить раздел вместе с подразделами содержащими значения или такое в С# невозможно?
     
  21. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Zelya, call в цикле - ещё хуже. =) Я не помню, как это делается в асме - так что не подскажу.
     
  22. Zelya

    Zelya

    Регистрация:
    20 апр 2007
    Сообщения:
    722
    DeleteSubKeyTree - работает на отлично. Только что проверил, вытерает все сабкеи со всеми значениями.

    Ну, не буду же я рутину писать по чтению байта из файла :)
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление