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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 707 708 [709] 710 711 ... 761
10621  Qt / Общие вопросы / Re: Передача значения в главный поток. (Qt 4.6) : Февраль 27, 2010, 18:33
1. При работе с нитками глобальных переменных нужно избегать всем доступными средствами
2. Смотря какой цикл и тип соединения сигнала-слота Улыбающийся. Если используется DirectConnection, то слот будет выполняться в контексте главного потока и ему будет пофиг что делает доп. поток, а, если QueuedConnection (BlockingQueuedConnection), то чтобы слот вызвался, в доп. потоке должен крутиться QEvenLoop.
Если connect связывает 2 QObject созданных а разных нитках - то обмен сигнал/слот будет производиться только через QEvenLoop - и для DirectConnection тоже (просто вызывающий будет ждать пока событие принято из QEvenLoop приемника и обработано)
10622  Программирование / С/C++ / Re: очистка памяти : Февраль 26, 2010, 19:48
была такая мысль..... а что если мне после удаления b понадобится попользоваться ещё a?? ведь после delete b a похерится...как быть в таком случае...
Такое бывает, я часто решаю так

Код:
vector <A> mDataVec;
....
vector <A *> ptrVec;
...
ptrVec.clear();
for (int i = 0; i < mDataVec.size(); ++i)
 ptrVec.push_back(&mDataVec[i]);
Теперь я могу безболезненно удалять ptrVec, за хранение отвечает mDataVec. Отрицательная сторона - вектор указателей становится калечным если я меняю число элементов в mDataVec, об этом приходится помнить.
10623  Qt / Общие вопросы / Re: Передача значения в главный поток. (Qt 4.6) : Февраль 26, 2010, 18:50
Неверно, блокировать нужно, это не атомарная операция. Может наступить момент когда будет производиться одновременная запись и чтение переменной.
Ну я бы не сказал что "неверно" - просто надо иметь ввиду что установка FlagStop = 1 не прекратит вычисления в нитке немедленно, он может прокрутить еще 1 итерацию (а то и 2). Например PrintMess может быть вызван уже после установки. Если "нужны гарантии" - надо блокировать.
10624  Qt / Установка, сборка, отладка, тестирование / Re: Build qt application with g++ 4.5 on mac : Февраль 26, 2010, 14:28
Смотрите командную строку, примеры

-arch i386        // компилировать для Intel 32-bit
-arch x86_64    // компилировать для Intel 64-bit
-arch ppc         // компилировать для PPC 32-bit (устарело, не нужно)

Для текущей компиляции только 1 архитектура может (и должна) быть задана - хотя выходной "bundle" может содержать любой набор. Так же и для др компиляторов (не gcc) на Mac. Правда, gcc 4.5 я не видел, но очень маловероятно чтобы это было изменено.
10625  Программирование / Алгоритмы / Re: Параллельные вычисления : Февраль 26, 2010, 13:49
А топологическая сортировка точек не поможет в этом случае?
Если б у меня был массив/контейнер этих точек - то и проблемы бы не было. Просчитал все, потом пробежался еще раз и осреднил (ну запомнил бы индексы "блоков""). А у меня есть исходные треугольники. Для каждого из них:

- для каждого ребра (если оно достаточно длинное) вставляем N точек (вот он, блок)
- выбираем самое длинное ребро, разбиваем пополам (используя созданные точки). Получаются 1 новое ребро и 2 новых треугольника. Вставляем точки в новое ребро. Крутим рекурсивно пока все не измельчено. Сливаем рассчитанные точки (только результат) в файл.
- треугольник забыт, берем следующий
10626  Qt / Общие вопросы / Re: Нагрузка на поток : Февраль 26, 2010, 13:33
Ну тогда запускай вначале свой сервер в не оптимальном режиме и на первом этапе формируй базу статистики нагрузки, то есть, как бы обучаешь сервер. После скажем часа работы можно начинать перераспределять задания с учётом накопленных измерений.
То есть если ты такое сделаешь, то мы получим первый в мире потоковый сервер с искусственным интеллектом и способностью обучатся Улыбающийся

P.S. Можно даже сказать с применением нано-технологий... Улыбающийся
Ну может слишком громко сказано об интеллекте, но мысль хорошая, практичная. Засекать время каждого пакета (годится и для новых) и затем опираться на эту статистику. Понятно что она не идеальна (напр. ОС отдал все на back-end) но она ловит "пропорции". Реализация не сложна, без тестового режима можно обойтись, до тех пор пока возникнут проблемы с загрузкой - статистика накопится.
10627  Qt / Qt-инструментарий / Re: Qt Creator - вопрос по выбору способа встраивания ui : Февраль 25, 2010, 14:13
На роль "специалиста" не претендую  Улыбающийся
По поводу мн. наследования: это хорошо написано в ++библии, если не путаю называется "Альтернатива: членство или наследование". Предлагается способ проверки: а может ли таких (встраиваемых) быть 2 или больше? Напр. 2 скроллбара - может, значит мн. наследование не подходит.

А если это Qt UI, то указатель - самое ходовое. Объект-член заклинит т.к. Qt parent удаляет child'ов. Мн. наследование - проблемы с "который QObject?".
10628  Qt / Общие вопросы / Re: Нагрузка на поток : Февраль 25, 2010, 13:52
и положил в пул задач. Пул поручает эту работу первой простаивающей нитке.
Ну может не первой а той что больше всего простояла. Но что пул нужен - это точно. Нехорошо помещать задачу в очередь нитки если она занята. На эмпирические оценки надежда слабая - хотя бы потому что нагрузка может измениться на ходу.
10629  Qt / Общие вопросы / Re: Нагрузка на поток : Февраль 25, 2010, 11:17
Это, в принципе, уже было предложено Igors. см. мой ответ http://www.prog.org.ru/index.php?topic=12552.msg79842#msg79842
Но это так, чисто академически. А вообще, основная засада тут в том, что рабочие потоки - асинхронны, т.е. принимают не задачи в виде данных, которые можно обработать и забыть, а в виде QObject-ов, которые крутятся в их цикле событий. Причем нагрузка от этих объектов принципиально непредсказуема - у одного может быть единственный обработчик сообщений, а у другого - полста сигналов и слотов на QueuedConnection. Поэтому поток не может принимать решение о том, что пора взять еще один объект на обработку, основываясь на количестве обслуживаемых объектов. Вот я и пытаюсь выделить критерий, чтобы понять, насколько загружен Event Loop потока.
Давайте разберемся. Выходит у Вас задачи привязаны к ниткам? Напр. клиент начинает что-то посылать. Ладно, послал первый пакет, она из ниток сервера его приняла. Теперь серия след. пакетов (от этого клиента) будет приходить на ту же нитку сервера. Но поскольку неизвестно когда клиент продолжит посылку - Вы занимаете нитку чем-то еще. Я верно понял?
10630  Qt / Общие вопросы / Re: проверить существование переменной : Февраль 24, 2010, 21:09
Знаю, подобная тема поднималась, но ответа на мой вопрос там нет, потому спрошу еще раз... как проверить существует ли переменная.
Никак, С/C++ никогда не был интерпретатором где такие вещи приняты.

Пишу такой код:
Код:
QVector<QTcpSocket*> connectionList;
connectionList.resize(4);
connectionList[0] = new QTcpSocket(this);
delete connectionList[0];
if (connectionList[0] == 0) qDebug << "111";

и в результате ничего не получаю. Может я что-то недопонимаю? а макрос NULL почему-то qt не кушает, выдает ошибку ((
То что Вы удалили connectionList[0] означает: память, на которую указывает connectionList[0] освобождена (и для всех членов QTcpSocket тоже). Но зачищать указатель язык для Вас не будет - это просто переменная и ее значение не будет изменено, что Вы с ней будете делать - решайте сами. В большинстве случаев сразу обнуляют (connectionList[0] = 0;)
10631  Qt / Общие вопросы / Re: Нагрузка на поток : Февраль 24, 2010, 20:16
Проблема в том, что задача асинхронная. Т.е. объекты в нитке управляются событиями, приходящими извне. Можно, конечно, выделить очередь событий в отдельную нитку, с которой рабочие потоки будут разбирать задания строго по одному (тут появляется оверхед с сериализацией доступа: получить мьютекс - это довольно дорогая операция в контексте мелких задач на полста умножений). Но в этом случае опять же встает проблема масштабируемости для потока, управляющего очередью заданий - что делать, если очередь событий в нем забилась окончательно, и задание в разы дольше дожидается "постановки на учет", чем собственно обрабатывается? Понятно, надо создать еще одну нитку с параллельной очередью заданий, и добавлять задания в ту, в которой их меньше. Вопрос в том, как узнать, что очередь событий потока заполнилась, и добавлять туда новые неэффективно? Понятно, я ищу сферического коня в вакууме, этакую идеальную парадигму масштабирования, но ведь Генри Форд нам завещал всегда желать большего. Улыбающийся
Про Форда ничего не слышал, но Ваш поиск коня мне нравится  Улыбающийся Я свое мнение не навязываю. но по-моему Вы преувеличиваете проблему, вероятно ее здесь вообще нет. Для простоты положим что на сервере аж один (!) процессор - а запросы поступают интенсивно. Что толку что Вы (допустим) распихали все по ниткам? Один процессор все равно будет тянуть как он сможет, больше задач - больше накладных расходов на синхронизацию. Разумно играть на приоритетах запросов/событий, напр. "сейчас мало задач в обработке, приемщик новых запросов имеет имеет высший приоритет". И наоборот "работы валом, пусть следующие запросы ждут" - это неизбежная ситуация когда "сервер перегружен запросами" - и стесняться этого нечего. Динамическое создание новых ниток эту проблему не решит.

BTW: "kramer3d" - это просто так или действительно "3d"?
10632  Qt / Общие вопросы / Re: Нагрузка на поток : Февраль 24, 2010, 18:46
Пока я придумал вот что - в EventLoop'е потока фронтэнда создаю таймер, который постит кастомные события с таймстампом самому себе через равные промежутки времени. Обработчик эти события отлавливает, замеряет время, которое событие простояло в очереди, усредняет/сглаживает его и пишет в член объекта потока. Это получается такая усредненная занятость. Пул менеджер потоки сортирует по этому значению, и по запросу выдает ссылку на поток с наименьшим значением, upd: ну, да, и если потока со значением меньше критического нету, создает новый и выдает ссылку на него. По-моему, довольно кривенько, и оверхед присутствует (вроде небольшой, хотя кто знает), но альтернативы пока не вижу. Пожалуйста, советуйте. Улыбающийся
Красиво но сложно  Улыбающийся Почему не простенько: задачи принимаются и складываются в одну общую очередь. Каждая нитка берет следующую задачу из этой очереди как только закончит предыдущую. Число ниток просто фиксировано. Вероятно задачи могут быть зависимыми, напр задача "B" может требовать результатов задачи "A". Мне кажется не стоит решать это созданием новых ниток (напр. нитка не может принять "C" потому что она ждет "B", давайте создадим еще нитку). Лучше сохранять результаты/контекст а потом восстанавливать.
10633  Qt / Общие вопросы / Re: срабатывание сигналов : Февраль 23, 2010, 00:23
при клике мыши по разным элементам таблицы,срабатывают оба сигнала,что не удивительно )))
Можно ли как-нить сделать так,чтобы сигнал click() срабатывал бы только когда сликаешь по одному и тому же элементу,т.е. когда не срабатывает сигнал selectionChanged(). А в остальных бы случаях срабатывал бы только selectionChanged()
Если я правильно понял, Вы хотите так:

- если пользователь кликнул (нажал и отпустил кнопку мыши) на уже выбранной ячейке - тогда Вы что-то делаете
- иначе (ячейка не была выбрана) - просто смена фокуса

Тогда надо изучать "хронологию" - пусть первым приходит selectionChanged. Тогда заведите переменную (член класса таблицы) напр. так (псевдокод)

Код:
void selectionChanged( ...) 
{
  mSelectionChangedFlag = true;   // запоминаем что пришел сигнал selectionChanged
  ....
}

void click(... )
{
  bool theSelectionChangedFlag = mSelectionChangedFlag;   // копируем флаг
  mSelectionChangedFlag = false;                                     // зачищаем для след. сеанса
  ...
  if (!theSelectionChangedFlag) {
    .... // ага, это "новая" ячейка, прпопускаем
  }
  else {
    .... // click на уже выбранную - акция
}
А вообще говоря, я согласен с ответившими - если операция зависит от контекста (на уже выбранную - так, иначе - по-другому)- это всегда сложновато и не очень удобно. Хорошая практика - использовать клавиши Alt и/или Ctl для спец. операций
10634  Qt / Пользовательский интерфейс (GUI) / Re: QTable : Февраль 22, 2010, 23:38
А если "мухи отдельно - борщ отдельно"? Есть расчеты и есть UI. Смешивать их - всегда плохо. Так что посчитайте последовательность Фибоначчи используя любой контейнер (std::vector,  QVector, QList и.т.п.) а потом, используя посчитанный контейнер как data model, заполните таблицу. И все будет гуд и займет пол-часа.
10635  Qt / 2D и 3D графика / Re: QGraphicsScene - рисуем (Проблема частоты mouseMoveEvent)[РЕШЕНО] : Февраль 22, 2010, 23:27
JayFOX, приммите мои извинения за оффтоп
Сталкивался ли кто-нибудь??? Особенно проблема 2 интересует!
Я делал такой плагин: показываю окно, в нем кнопка "Record". Пользователь выбирает одно из др. окон, выбирает примитив - запись началась, "Record" мигает. Не отпуская кнопку мыши, пользователь тянет примитив куда надо, обратно и.т.п. Все это время я снимаю время и координаты мыша, перевожу их в 3D координаты (в зависимости от окна где происходит драг). Как только  пользователь отпустил кнопку мыша - все, запись закончилась, можно ее сохранить и/или начать по новой. Результат интерполируется и записывается по кадрам (обычно 25/30 кадров в секунду).

Анализ результатов. Проблем с задержками/залипанием нет (делалось еще на G4 733 Mhz). Но масса проблем с "рукой", особенно когда движение медленное (дрожание, прыжки и.т.п). То, что нужна пост-обработка, фильтры и.т.п. - это точно. Ручной ввод надо рассматривать как создание "сырых" базовых/исходных данных, которые потом надо парить в редакторе - тогда все на своем месте.
Страниц: 1 ... 707 708 [709] 710 711 ... 761

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