ПрограммированиеФорумОбщее

Асинхронная загрузка... (2 стр)

Страницы: 1 2
#15
16:18, 25 мар 2011

jsmith
А он итератор возвращает))) метод GetFirst() :) Это не суть в общем)))

#16
17:22, 25 мар 2011

У меня все очень похоже
но Sleep(10) это зло
процессор будет постоянно впустую проверять - надо ли ресурс грузить или нет - вроде не тяжело, но квант времени будет стабильно кушаться.
я вместо этого имею event который выставляется в 1 при добавлении любого ресурса в очередь на загрузку и снимается в 0 при загрузке ресурса (при этом по 1 евенту загрузка проводится не для 1 а для всех ресурсов в списке). Главное - вовремя ставить/снимать евент чтобы не вышло, что евента нет и не будет, все его ждут, а ресурс в очереди стоит.

#17
18:35, 25 мар 2011

jsmith
Да, зло. Один мудрый подсказал мне обратиться к примеру - ContentStreaming из mssdk, там собственно все хорошо показано, и кстати говоря для контроля применяется семафор(тот же event почти), хорошая на мой взгляд идея.

#18
18:38, 25 мар 2011

skyformstd
> там собственно все хорошо показано, и кстати говоря для контроля применяется
> семафор(тот же event почти), хорошая на мой взгляд идея.

это не значит что она самая лучшая :) lock-free контейнеры погугли

#19
19:05, 25 мар 2011

Про lock-free знаем, но в ней нужно сначала разбираться и переписывать код чуть-чуть...

#20
11:35, 5 апр 2011

А доступ к классу по указателю это атомарная операция?
То есть я не имею в виду изменение указателя,а лишь доступ. Например -
В одном потоке - 

pSome->FuncOne();

В другом -

pSome->FuncTwo()//Или даже та же функция(FuncOne();)//

То есть по идее это чтение из памяти одновременно, а это зло.
Умные указатели? ))
Или все нормально...

#21
10:48, 18 мая 2011

skyformstd
Можно сделать так

template<class T>
class refLock
{
     T* base;

     refLock(ref<T> )
     {
          make mutex;
     }

     T* Get()
     {
           return base;
     }

     ~lock()
     {
          destroy mutex;
     }
};

template<class T>
class ref
{
     T* base;

     T* Get()
     {
           return base;
     } 

     refLock<T> GetInterlocked()
     {
           refLock<T> lock(base);
           return lock;
     }
};

ref<Foo> foo = new Foo();

foo.GetInterlocked().Get() ... бла бла
#22
11:53, 18 мая 2011

Я делал так;
1. Брал размер файла, делал VirtualAlloc на размер выравненный на 4К.
2. Открывал файл как NOBUFFERING + OVERLAPPED.
3. Делал OVERLAPPED запрос на весь файл.
4. Далее стандартно - в конце кадра все ждущие ресурсы проверяют состояние, копируют данные из памяти себе, закрывают файл и убивают память через VirtualFree
Для паков требуется выравнивание файлов внутри на 4К.

Страницы: 1 2
ПрограммированиеФорумОбщее

Тема в архиве.