Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Строки в разделяемой памяти

246
27 декабря 2006 года
GIZMO
1.8K / / 30.07.2004
Привет!

Возникла необходимость поработать со списком строк. Список строк д.б. разделяемым N-м кол-вом потоков и процессов. Ясно, что нужно мапить поименованный файл + использовать событие со сбросом вручную или мьютекс (достаточно эксклюзивного доступа, хотя в идеале можно - один писатель и много читателей). Далее начинаются вопросы:
1. Как работать со строками? Т.е. как организовать их размещение в памяти, чтобы было удобно работать и производительность была на уровне. Есть такая идея (не очень умная наверно) - в классе завести TStringList и при каждом обращении лочить мап-файл, считывать туда список строк, выполнять операцию через StringList и катать обратно. Например вставка строки:
Код:
// test...
// Lock with mutex
void Lock() { ::WaitForSingleObject(m_hMutex, INFINITE); };
// Unlock with mutex
void Unlock() { ::ReleaseMutex(m_hMutex);

void TCNOptions::AddString(String& s)
{
    //TODO: Add your source code here
    int size=STRING_PAGE_SIZE;
    char* pStrings = (char*)(m_pCNOptions + sizeof(CNOptions));
    Lock();
    m_pLastQuery->Text = pStrings;
    size = m_pLastQuery->Text.Length() + s.Length() + 1;
    while(size >= STRING_PAGE_SIZE)
    {
        m_pLastQuery->Delete(0);
        size = m_pLastQuery->Text.Length() + s.Length() + 1;
    }
    m_pLastQuery->Add(s);
    wsprintf(pStrings, "%s", m_pLastQuery->Text.c_str());
    Unlock();
}

какие есть еще варианты по размещению строк в памяти, быстрого доступа и т.п.
2. Как ресайзить буфер?
Тут вообще хз, что думать... Или задавать фиксированный размер (не в тему:)) мап-файла или как его ресайзить когда он заполнится? М.б. держать список из хендлов мап-файлов и при необходимости открывать новые файлы, но это как-то хитро вы^%$# получается?

Вообщем жду Ваших предложений, может кто даст ссылку или приведе пример похожего класса. Спасибо!
309
27 декабря 2006 года
el scorpio
1.1K / / 19.09.2006
Цитата:
2. Как ресайзить буфер?


Можно так:

 
Код:
Buffer = (TBuffer_Type*) realloc (Buffer, NewSize);

Иных способов не ведаю ;)
246
27 декабря 2006 года
GIZMO
1.8K / / 30.07.2004
Цитата: el scorpio
Можно так:
 
Код:
Buffer = (TBuffer_Type*) realloc (Buffer, NewSize);

Иных способов не ведаю ;)


Это для "кучи", а я говорю про - файл проецируемый в память. Как его ресайзить?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог