Russian Qt Forum
Май 21, 2024, 11:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 706 707 [708] 709 710 ... 761
10606  Qt / Общие вопросы / Re: (почти БД) Как быстрее обработать большой файл? : Март 05, 2010, 16:11
а потом обрабатываеть простым циклом или же есть способ заюзать запрос какой-нибудь?
Не знаю что значит "обрабатывать". Если есть вектор theStr - то все данные уже на руках. Как перерисовать таблицу - точно не скажу, но добавлять строку за строкой не следует. Я бы смотрел в сторону data model, основанной на theLogData и theStr. Считал данные, сказал таблице setModel - готово.

Насчет "слежки" - имеет смысл полагать что данные доливаются в конец лога (append). Это можно проверить используя даты создания и модификации файла. Если это не так - ничего не попишешь, придется перечитать весь файл. Чтение "хвоста" такое же как и всего файла - надо только сначала сделать seek на хвост и resize для theLogData.
10607  Программирование / Алгоритмы / [РЕШЕНО] OpenMP и деление дерева : Март 05, 2010, 14:29
Добрый день

Использую OpenMP и весьма доволен этой библиотекой. Не могу сообразить как мне распараллелить деление дерева, алгоритм стандартный:

- Есть очередь нодов, (вначале только с 1 нодом).
- Извлекаем первый нод из очереди, делим его на 2 нода
- Подсчитываем приоритеты получившихся нодов, и, если надо, добавляем их в очередь
- Опять извлекаем первый нод (нод с наивысшим приоритетом) из очереди и.т.д

Нод хранит список примитивов которые его пересекают. Приоритет вычисляется как число примитивов в ноде помноженное на его размер. Все работает. Теперь как задействовать N ниток? Понятно что помещение в очередь и извлечение из нее должны быть защищены блокировками. Возможна ситуация когда очередь пуста, но это не значит "конец расчета" - нод(ы) делятся в др. нитках. Как бы мне это все организовать попроще и покрасивее?

Спасибо
10608  Qt / Общие вопросы / Re: (почти БД) Как быстрее обработать большой файл? : Март 05, 2010, 10:43
Не совсем БД это, но теоретически, очень даже похоже.
Есть log-файл одной проги. Сейчас он занимает около 12 метров.
12 метров - это по нынешним временам не объем (да и по вчерашним тоже). Где-то до 500 метров можно жить просто читая весь файл в память, не связываясь с БД

Хочу попросить совета по первому пункту. Как это лучше организовать? я вчера набросал тестовый проект (в QTreeWidget пихаю все различные символы в позиции string[22] всего файла (это идет секунд 15). потом перебором (уже вторым, знаю, что не оптимизировано) по двойному щелчку на QTreeWidgetItem я начинаю поиск (цикл с условием на сравнение этого символа в 22 позиции) нужных мне строк, которые потом запихиваю в QTableWidget в две колонки: первая - ДО символа в 22 позиции, вторая - все, что после него). И вот эта операция занимает аж несколько минут, при котором прога подвисает (без потоков пока делал, просто проверить).
Читаем все в 1 блок памяти (без QString), разбираем строки и "позицию 22", это должно занять до 5 секунд даже на слабеньком железе и без всяких потоков. Вот затем можно подумать как лучше/быстрее добавить это в UI. Данные я бы организовал так:

Код:
QVector <char> theLogData;  // содержимое файла скопированное в память

struct MyStr {
 int mBeg1;       // смещение первой суб-строки в theLogData
 int mBeg2;       // смещение второй суб-строки в theLogData
 int mEnd;        // смещение конца строки
 int mKey22;     // значение в "позиции 22"
};

QVector <MyStr> theStr;  // в результате разборок этот вектор заполнен
А строки получать в делегате, незачем их хранить

10609  Qt / Общие вопросы / Re: загрузка из файла в определенном формате : Март 04, 2010, 20:28
что такое "паскалевская строка"?
Код:
typedef unsigned char Str255[256];  // MacTypes.h
Нет 0-терминатора, длина в 1-м байте
10610  Qt / Общие вопросы / Re: Корректен ли вопрос: Чем QT лучше MFC / ATL ? : Март 04, 2010, 20:20
Этот сайт  - откровение для меня! Очень надеюсь, что QT окажется удобнее чем MFC+ATL...
Ну как сказать. "Переучиваться" всегда намного труднее чем "учиться" - старый опыт не всегда в плюс

Цитата: Sickfar
link=topic=12638.msg80647#msg80647 date=1267622451
и все наработки стырены из Apple и изуродованы под ассемблер.
Да если б они, гады, по уму тырили - я бы не возражал, то их разборки. Так ведь нет, испакостят все - и заставят покупать. Ладно, это флуд, умолкаю
10611  Qt / Пользовательский интерфейс (GUI) / Re: Подскажите простой способ нотификации между двумя Qt приложениями : Март 04, 2010, 18:13
Если оба application "на руках" - то и через DLL неплохо будет
10612  Программирование / С/C++ / Re: Проблема с namespace : Март 04, 2010, 15:30
Не писать static если планируете вызывать Utils::Func1(0) из др. файла. Оставьте в h файле только объявления, тела перенесите в Utils.cpp. Альтернатива: заменить static на inline. Если есть Utils-переменные они должны быть объявлены как extern в Utils.h
10613  Qt / Общие вопросы / Re: QSharedMemory - сигнал на изменение своими руками : Март 03, 2010, 03:01
Но как я понял человек хотел, чтобы event от ОС пришел "типа поменялось".
Что человек хочет - это его дело. А моя задача была максимально быстрый обмен данными между 2 процессами (32 и 64 бит) - вот и пришлось крутить через shared memory.
10614  Qt / Общие вопросы / Re: QSharedMemory - сигнал на изменение своими руками : Март 03, 2010, 01:17
Спасибо, идея интересна, но дальше разблокировки gui мы не ушли. Раздумываю над системой семафоров...
Там получается совсем несложно даже без Qt. Семафоры удобно заводятся в разных процессах (как мне надо было) и могут быть общими. Один процесс записал что-то в shared memory и сделал sem_post (открыл семафор), другой стоял на sem_wait, семафор открылся, забрал из shared memory, отсигналил по второму семафору и опять ушел на sem_wait. Для второго процесса - то же самое. Ну правда в posix семафоры срабатывают по сигналам, это надо проверять. На Вындоуз - аналогично, только с мутексами.
10615  Qt / Общие вопросы / Re: QSharedMemory - сигнал на изменение своими руками : Март 02, 2010, 23:47
Была такая необходимость, решил через 2 семафора (созданных в 2 процессах)
10616  Qt / Общие вопросы / Re: QList + qSort : Март 02, 2010, 23:30
Здравствуйте, коллеги.
У меня есть еще такой интересный вопрос.
Я использую qSort на массиве точек. Точка описана классом Point.
Point (float x, float y, float z);
если в операторе "<" выполняется следующее дествие:
return (x<rh.x);
То все отлично. Массив точек упорядочивается по x.
Если оператор выполняет следующее действие:
return (x<rh.x && y<rh.y && z<rh.z); или return (x<rh.x && y<rh.y);
То массив не сортируется вообще никак. То есть он сортируется, выборочно, кусками. И не правильно при этом.
Может быть, здесь есть какой то прикол???
Я делаю так
Код:
bool Point::operator < ( const Point & sec ) const
{
// первый ключ x
  if (x < sec.x) return true;
  if (x > sec.x) return false;

// второй ключ y
  if (y < sec.y) return true;
  if (y > sec.y) return false;

// третий ключ z
  if (z < sec.z) return true;
  return false;
}
10617  Qt / Общие вопросы / Re: Запись в файл объектов : Март 02, 2010, 03:28
Есть такой вопрос - в С++ я мог взять объект класс и записать его в двоичный файл примерно такой конструкцией - имена классические
Код:
file.write(reinterpret_cast<char*>(&myObj), sizeof(myClass));

ВОт, потом читая из файла аналогичной конструкцией read получал объект точно такой же, какой записал.
Это не будет работать для объектов имеющих виртуальные методы (указатель на VMT в sizeof входит и при чтении будет затерт). Поскольку в Qt практически все объекты с virtual - это не будет работать в Qt, надо использовать QDataStream и операторы >> и <<, сделано очень удобно.
10618  Qt / Общие вопросы / Re: Подсчет частоты слов в тексте : Март 02, 2010, 02:53
-- Необходимо подсчитать сколько раз слово встречается в списке и убрать дубликаты. Использую контейнер QHash<QString, int> для быстрой обработки и записываю финальные Key и Value в разные списки. Но функция выдает только список уникальных слов (Key) в конце и не выводит частоты. Кроме того, функция обрабатывает текст размером 100 Кб ОЧЕНЬ медленно, может есть какие-то варианты ее оптимизировать?
Оператор [] для QHash на примере:

Код:
 for (int i=0; i<Token.size(); ++i)
        ++countWord[Token[ i ]];
Оператор возвращает ссылку на значение (у Вас int), его можно прямо менять. Если ключа (Token[ i ]) не было в QHash - он будет вставлен (с default значением, 0 для int). Для подсчетов числа вхождений - то, что надо

Для печати вхождений Вы правильно "итерировались" по countWord но чего ж QDataStream объявлять в цикле? А если надо добавить к спискам, то проще countWord.keys() и countWord.values() вместо цикла.

Удаление дубликатов также легко и приятно

Код:
 QStringList outLst;
 for (int i=0; i<Token.size(); ++i)
        if (countWord[Token[ i ]]  < 2)
          outLst.push_back(Token[ i ]]);  
Здесь никаких вставок в countWord не произойдет, т.к. все ключи созданы при подсчете вхождений

Edit: может если 2 и более вхождения - то надо убрать все кроме первого? Тогда тоже легко, напр
Код:
 QStringList outLst;
 for (int i=0; i<Token.size(); ++i) {
      int & val = countWord[Token[ i ]];
       if (val < 0) continue;                         // второе или след вхождение, пропускаем
       outLst.push_back(Token[ i ]]);
       if (val > 1) val = -val;                        // отмечаем
 }  
10619  Программирование / Алгоритмы / Re: Параллельные вычисления : Февраль 28, 2010, 13:11
Параллелить по треугольникам возможно но неудобно. Во-первых вылазит много блокировок связанных с тем что, как правило, треугольники имеют общие ребра. А главное - мне очень трудно избавиться от массы временных данных, распределяемых при обработке каждого треугольника.

Сделал так: набиваю пул точек для расчета (сохраняю также данные о блоках). После каждого треугольника смотрю - если в пуле достаточно точек - запускаю их расчет всеми нитками, потом осредняю. очищаю временные данные, пошел дальше. Работает, но к сожалению текст не так прост как хотелось бы  Улыбающийся
10620  Qt / Общие вопросы / Re: Передача значения в главный поток. (Qt 4.6) : Февраль 28, 2010, 12:55
Если connect связывает 2 QObject созданных а разных нитках - то обмен сигнал/слот будет производиться только через QEvenLoop - и для DirectConnection тоже (просто вызывающий будет ждать пока событие принято из QEvenLoop приемника и обработано)
Здесь я был неправ (ошибся разбирая исходники). После критики BRE сделал тестовый примерчик (attachment) - да, все работает согласно документации, и вызов слота c DirectConnection происходит в нитке вызывающего.
Страниц: 1 ... 706 707 [708] 709 710 ... 761

Страница сгенерирована за 0.072 секунд. Запросов: 23.