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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 708 709 [710] 711 712 ... 761
10636  Программирование / Алгоритмы / Параллельные вычисления : Февраль 22, 2010, 19:57
Добрый день

Задача типа "близок локоть да не укусишь"  Улыбающийся  Вот максимально упрощенное описание: есть "точки" значения в которых должны быть вычислены, а потом осреднены с соседними. Схема такая:

*------*-----*-----*   (первый блок из 4 точек)
*------*-----*            (второй блок из 3 точек)
*------*---*........*     (третий блок из 100 точек)
и.т.п

Осреднение происходит для точек одного блока, однако одна и та же точка может входить в любое число блоков

Код:
struct Point {
  float mBaseVal;   // начальное значение - считается 1 раз и больше не меняется
  float mCalcVal;   // выходное значение (с учетом всех осреднений)
  float mBaseW;    //  "собственный" вес точки (обычно 1.0f)
  float mCalcW;     //  вес точки с учетом всех осреднений

  void Calculate( float weight )
  {
    mBaseW = mCalcW = weight;
    mBaseVal = mCalcVal = CalculatePoint(...):   
  }

  void Blur( const Point & src ) 
  {
    mCalcVal = (mCalcVal * mCalcW + src.mBaseVal * src.mBaseW) / (mCalcW + src.mBaseW);
    mCalcW += src.mBaseW;
  }
};
И все прекрасно, и проблем никаких, но вот когда я вычисляю точки параллельно, в разных нитках - тогда "ой". Вычислив точку, я не могу ее сразу осреднить т.к. соседняя может быть еще не вычислена. Ждать ее бесполезно - дело умрет на блокировках. Конечно, есть "общее" решение - сделать 2 прохода, первый вычисляет (параллельно), второй осредняет. Но здесь это очень накладно, нужно приложить массу усилий чтобы повторить всю последовательность блоков точек. Есть ли свежие идеи? Как выкрутиться?

Спасибо
10637  Программирование / С/C++ / Re: Конструкторы, параметры по умолчанию... : Февраль 19, 2010, 21:19
Код:
int test_method(int index,const QMap <QString,QString>& additional_params);
Мелочь конечно, но можно подсократить текст
Код:
typedef QMap <QString,QString> QSSMap;
..
int test_method(int index,const QSSMap & additional_params);
10638  Qt / Общие вопросы / Re: Как можно приостановить процесс ? : Февраль 19, 2010, 21:14
шедулеры и вытесняющая многозадачность великая вещь не правда ли?)
Ну эти слова я тоже слышал  Улыбающийся Можно предположить что OS получает управление "по прерыванию от таймера" (как это называлось раньше). Ладно, с учетом приоритетов посчитал кому надо дать процессор(ы) а кого и тормознуть. Ну а дальше-то что? Все равно надо передать управление от нитки к нитке, а для этого переключить стек, восстановить регистры и.т.п. И все это с успехом делается - интересно/полезно было бы узнать как, пусть в общих чертах.
10639  Программирование / Алгоритмы / Re: Проблемы с большим массивом : Февраль 19, 2010, 18:06
Сделал, все очень просто:

- пройдя по массиву указателей, вписать в каждый элемент его "место" где он должен находиться (индекс в массиве указателей)

- сортировать по вписанному индексу

Тему можно закрывать, нет тут ничего полезного, просто меня переклинило  Улыбающийся

Edit: если известно "место куда поставить" (индекс), то сортировка не есть лучшее решение

Код:
int i, limit = array.size();
for (i = 0; i < limit; ++i)
 while (array[ i ].index != i)
  Swap(array[ i ], array[array[ i ].index]);
Это заметно быстрее сортировки
10640  Qt / Общие вопросы / Re: Проблема сигнал-слот при работе с double : Февраль 19, 2010, 18:01
Ну и запросто.
В рантайме формировать маску для QLineEdit или звать setDecimals() для QDoubleSpinBox. Что может быть проще???
Дв, но при этом текст, попавший в QLineEdit проникает обратно в данные, обрезая их. Об этом dr_Begemot и говорит (как я понял)
10641  Разное / Объявления / Разовый заказ (импорт Adobe Illustrator файлов) : Февраль 19, 2010, 15:53
Добрый день

Имеется разовый заказ: импорт AI (Adobe Illustrator) файлов. Задача прочитать/разобрать AI файл и получить его содержимое в виде массивов данных (STL контейнеров). Пишите в личку.
10642  Qt / Общие вопросы / Re: Как можно приостановить процесс ? : Февраль 18, 2010, 16:00
Я вот чего подумал - а ведь сам ОС постоянно передает управление от одной нитки к другой. Если напр. я в нитке уйду в глухие вычисления, то ОС ведь не умрет, даже на 1 процессоре. Хммм... и как он это делает? Более того, он делает это довольно быстро, напр. с тем же 1 процессором 8 ниток не будут сильно медленнее чем 4.
10643  Программирование / Алгоритмы / Re: Проблемы с большим массивом : Февраль 18, 2010, 15:00
Пока в голову не пришло ничего лучшего, идея "в лоб": по элементу же можно найти указатель в массиве указателей.  идем по массиву указателей. Если текущий элемента не на своем месте, то меняем местами текущий элемент с тем , который должен быть на этом месте. Вариант из разряда "медленно но верно".
Обмен здесь вообще не пляшет - ведь обменивая, мы заставляем указатель ссылаться уже на другой элемент. Есть алгоритм, который берет затираемый элемент "в карман" - но он не работает если я не могу превратить адрес в индекс.

Но эт все мелочи, мне больше про куски памяти интереснее. Не понимаю как можно реализовать индексацию (и сортировку), если данные лежат в нескольких разных кусках памяти. Я бы понял если это реализовывать как раз массивом указателей. Но тогда зачем его удалять? Можт стоит реализовать хранилище массивом указателей (тогда проблема перестановки элементов отпадет просто) ?
Про индексацию таких данных я написал выше, ничего необычного нет - напр. QList тоже хранит данные в разных местах. Др. дело что мне не резон распределять блок памяти для каждого элемента 24 байта. А выделить данные одним куском не могу - ОС не дает. Вот и храню в блоках. Таскать массив указателей смысла нет - он нужен только на этапе подготовки данных.

Ладно, пока сделал через файл, дальше видно будет.
10644  Qt / Пользовательский интерфейс (GUI) / Re: как избавиться от буферизации при добавлении в QTextEdit? : Февраль 18, 2010, 12:12
Код:
		listOutput->moveCursor( QTextCursor::End );
listOutput->insertPlainText( aString );
может по-простому добавить
Код:
listOutput->repaint();
10645  Программирование / Алгоритмы / Re: Проблемы с большим массивом : Февраль 18, 2010, 11:01
ПС: не очень понял, если память под массив элементов выделена кусками, то как можно говорить о порядке элементов ? Или еще учитывается порядок кусков памяти ?
Нет, все легально, куски могут быть распределены в любом порядке. Выглядит это примерно так
Код:
template <class T>
struct ChunkArray {
...
 T & operator [] ( size_t index )  { return mChunk[index / COUNT_IN_CHUNK][index % COUNT_IN_CHUNK]; }
...
// data members
 vector <T *> mChunk;  // вектор указателей на выделенные блоки
};
Это можно сортировать, но по адресу я не могу знать индекс. Ладно, записал индекс в сам элемент <T>, но почему-то "не переставляется"  Улыбающийся
10646  Qt / Общие вопросы / Re: Проблема сигнал-слот при работе с double : Февраль 18, 2010, 00:57
Скажите пожалуйста, а в чем смысл работать с одной точностью а пользователю показывать другую?
Все поля ввода должны показывать именно то, что в них введено. Точно то, что в них "хранится".
Если вам нужна большая точность во внутренних рассчетах - на здоровье, но пользователь должен видеть реальные цифры.
"Программа должна иметь установку сколько чисел после запятой показывать" - примерно так звучал запрос моего пользователя  Улыбающийся Да и не всегда оно "введено", бывает и "рассчитано".
10647  Программирование / Алгоритмы / Проблемы с большим массивом : Февраль 18, 2010, 00:49
Добрый вечер

Имею большой массив данных (гигабайты). Распределяю память для него кусками. Сделал свой контейнер, могу использовать оператор []. С массивом надо делать разные хитрые перестановки, сортировки и.т.п. Для этого делаю линейный массив указателей (одним блоком памяти) на элементы массива. Сделал с указателями все что хотел. Теперь осталось переставить элементы в массиве данных в том же порядке как они следуют в массиве указателей (и избавиться от массива указателей который больше не нужен). Использовать новый массив данных не могу - не лезет по памяти. А как переставить "на месте" - не могу сообразить. Есть идеи - подскажите.

Спасибо
10648  Qt / Общие вопросы / Re: Проблема сигнал-слот при работе с double : Февраль 17, 2010, 23:54
Проблема в том, что если число, заданное в программе функцией setMax(double val), было точнее, чем точность, указная функцией getPrecision(), то при вызове из формы слота setMax(QString val) проверка покажет что число изменилось и будет установленное новое число.
Я сталкивался с такой проблемой (правда без Qt). Пример:

- пусть отображаемая точность всего 2 знака после запятой. Пользователь ввел 3.1415, это число "принято". Затем, напр. он закрыл окно ввода и снова открыл. Отображается 3.14. Если он сейчас отредактирует - напр. 3.1, затем вернул 3.14 - точность будет потеряна, ничего не попишешь. Однако если он НЕ вводил - остается 3.1415. Это значит что я должен различать "ввод руками (пользователя)" и "ввод программно" и принимать данные только в первом случае. Насколько я знаю, в Qt это textChanged и textEdited
10649  Qt / Общие вопросы / Re: Как можно приостановить процесс ? : Февраль 17, 2010, 23:18
Че тут, пробовать надо, а не рассуждать о страшных последствиях Улыбающийся
Попробовать-то не вредно, только вот заказчику я бы такую фичу не обещал - потому как не знаю что мне ему ответить если он спросит "Я за это заплатил, а оно вылетает, а на той платформе вообще не работает. Исправляйте как хотите, это Ваши проблемы".

Исходный вопрос надо понимать "есть ли легальная, кросс-платформенная возможность остановить процесс средствами Qt?" (пусть автор меня поправит если не так). Нормальный ответ на этот вопрос: нет, такой возможности нет. А хотите делать используя нативные средства ОС (крутизну  показать) - дело Ваше, но это может дорого Вам обойтись.
10650  Qt / Общие вопросы / Re: Как можно приостановить процесс ? : Февраль 16, 2010, 10:52
Это далеко не предложение Улыбающийся Если удастся открыть поток с нужными правами и функция SuspendThread вернет положительный результат - поток остановлен, факт.
Ладно, расширим наш багаж знаний, читаем MSDN
Цитировать
This function is primarily designed for use by debuggers. It is not intended to be used for thread synchronization. Calling SuspendThread on a thread that owns a synchronization object, such as a mutex or critical section, can lead to a deadlock if the calling thread tries to obtain a synchronization object owned by a suspended thread. To avoid this situation, a thread within an application that is not a debugger should signal the other thread to suspend itself. The target thread must be designed to watch for this signal and respond appropriately.
Оно конечно, "нет преград энтузиастам", но мне кажется - связываться с таким мутным делом не резон, скорее всего не остановим, а покалечим. Ну и кросс-платформенностью там и не пахнет. Напр. в Posix такого точно нет
Страниц: 1 ... 708 709 [710] 711 712 ... 761

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