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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 36 37 [38] 39
556  Программирование / Общий / Re: Сценарий действия сил : Январь 17, 2016, 20:37
И вот вылазит проблема - силы могут оказаться "несовместимы". Напр сумма сил Force_Path + Force_Seek дает в рез-те полную ерунду. Зато есть смысл применить их последовательно,

Что значит "несовместимы"? Если имитация имеет физический смысл, то вектор результирующей силы как раз будет равен сумме всех действующих сил.
557  Qt / Многопоточное программирование, процессы / Re: Вопрос про слоты в потоке. : Ноябрь 20, 2015, 08:16
Ваш перепредыдущий комментарий неверен Улыбающийся
Если отнаследоваться от QThread и в конструкторе сделать moveToThread(this), то мы получаем класс, который полностью существует в своём потоке. И никаких дополнительных телодвижений не надо Улыбающийся

Наследование от QThread и вызов в конструкторе moveToThread(this) дает, конечно, необходимый результат, и при быстром решении конкретной задачи может быть использован.
Я предложил решение, рассматривая задачу в общем виде (я же не знаю заранее, как будет использован Worker).
В случае же наследования и использования moveToThread(this) существуют ограничения, о которых необходимо помнить

Нельзя указывать родителя, иначе moveToThread не сработает.
Цитата: Qt5.5
The object cannot be moved if it has a parent.
Если объект без родителя создан в куче (через new), а не на стеке, то необходимо использовать соединение с deleteLater, что иногда является настоящим геморроем.
Если объект создан на стеке, то его принудительное удаление может быть вызвано в момент его работы в другом потоке, что приведет к crash.

Все эти нюансы могут быть неочевидны программистам с малым опытом работы с Qt, его QObject и QThread.
558  Qt / Многопоточное программирование, процессы / Re: Вопрос про слоты в потоке. : Ноябрь 19, 2015, 18:14
Именно, про ошибки такого рода я и писал

Код
C++ (Qt)
 
Worker::Worker(QObject *parent) : QObject(parent) {
connect( &_thread, &QThread::started, this, &Worker::process );
connect( MainWindow::ui().startPushButton, &QPushButton::clicked, this, &Worker::start );
connect( MainWindow::ui().signalPushButton, &QPushButton::clicked, this, &Worker::slot );
}
 
 

Здесь соединяются сигналы и слоты способом Qt::DirectConnection. Вызов сигнала и далее вызов слота всегда будет в потоке вызвавшем &QPushButton::clicked, сколько бы мы не делали moveToThread для Worker. Таким образом запуск отдельного потока ничего не даст.

Наследование от QThread не расширяет функциональность, а всего лишь вынужденная необходимость, как и наследование от QObject.
При этом QThread сам является QObject и функционирует в потоке, в котором был создан. Метод run единственный метод QThread, который вызывается в отдельном потоке.
559  Qt / Многопоточное программирование, процессы / Re: Вопрос про слоты в потоке. : Ноябрь 16, 2015, 08:43
Да, давно такого чуда не видел  Веселый. Вообще метод moveToThread считаю вредным, о позволяет писать небрежный код и приводит к ошибкам, которые долго ищутся - с виду то все ок.
Например, сначала произвели подключение сигналов и слотов, получили DirectConnection, а затем сделали moveToThread и получили кучу проблем, так как вместо DirectConnection должно было быть QueredConnection. Это всего лишь простой пример, не говорю уже о проблемах с удалениями таких объектов и т.п.

Предлагаю сделать так

Код
C++ (Qt)
 
class Worker
   : public QObject
{
   Q_OBJECT
 
   // ...
 
   Q_SLOT void processSlot ();
};
 
 
class WorkThread
   : public QThread
{
   Q_OBJECT
 
private:
   Worker m_worker;
 
public:
   WorkThread ( QObject * const parent = 0 );
 
protected:
   virtual void run () final;
 
public:
   Q_SIGNAL void processSlot ();
};
 
 

Реализация

Код
C++ (Qt)
 
void Worker::processSlot ()
{
   // my process realization
};
 
void WorkThread::run ()
{
   Worker worker;
   connect( this, &WorkThread::processSlot, &worker, &Worker::processSlot );
   exec();
}
 
 

использование в коде

Код
C++ (Qt)
 
void foo ()
{
   // ...
   WorkThread thread;
   connect( &invoker, &processInvoked, thread, &processSlot );
   thread.start();
   // ...
};
 
 

560  Qt / Общие вопросы / Re: Разделяю один объект на два. Как правильно сделать их взаимодействие? : Ноябрь 10, 2015, 09:29
Чаще всего так и делают (я не исключение), если не хотят заморачиваться - весь функционал реализуют в EditorToolBar, назначая ему кроме других ролей и роль контроллера. Помещают туда и загрузку из конфига, и реакцию на мышь, и др.
Количество кода EditorToolBar разрастается, повторное использование затрудняется.
По хорошему, если рассмотреть EditorToolBar, как автономный объект, который может просто переключаться в разные состояния, тем более что они перечислены в enum, то вызвать метод (слот) изменения состояния у EditorToolBar должен внешний(е) объект(ы), например, EditorToolBarConfig - загрузчик состояния из конфига, EditorToolBarMousePosition - изменяет состояние EditorToolBar по мышиным событиям, EditorToolBarDocumentModel - изменяет состояние EditorToolBar в зависимости от модели документа и т.п.
561  Qt / Общие вопросы / Re: Программа падает при изменении строки. : Ноябрь 09, 2015, 10:07
Вы уверены, что такое использование memset безопасно? Надеюсь не забыли по необходимость явного удаления IModelItem через delete в таком массиве.
Почему бы не воспользоваться стандартными методами std::vector?
562  Qt / Общие вопросы / Re: Программа падает при изменении строки. : Ноябрь 09, 2015, 08:24
Сразу напрашивается вопрос - strInfoList.at(0) существует? Т.е. размер списка strInfoList больше нуля.
Чтобы не проверять можно использовать strInfoList.value(0).

Второй возможный вариант - memcpy нигде не используется?

Операционка ни при чем.
563  Qt / Общие вопросы / Re: Разделяю один объект на два. Как правильно сделать их взаимодействие? : Ноябрь 09, 2015, 08:17
EditorToolBar - это панель с кнопками и ничего более.
Для наличия вышеперечисленной функциональности необходима дополнительная внешняя сущность(ти), которая управляет состояниями EditorToolBar.

Каким образом предполагалось обращение EditorToolBar к вышестоящему виджету для изменения его состояния, по таймеру?
Иначе это всегда внешнее воздействие на EditorToolBar - через метод update, сигнал слот.

Управляющей сущностью может быть сам Editior в случае, если очень лень писать, но по-хорошему это должен быть отдельный тип.
При проектировании архитектуры всегда необходимо руководствоваться необходимостью дальнейшего сопровождения - в том числе легкого изменения поведения программы (например, настройки передаются по сети или добавились новые режимы работы) и возможности повторного использования ее компонентов без необходимости их модификации.
564  Программирование / Алгоритмы / Re: Потенциал Леннард-Джонса : Ноябрь 06, 2015, 12:24
Тут дело не в крутизне  Веселый
Заменяя бесконечно малые изменения dt на конечные, мы получаем существенную погрешность.

Пусть скорость линейная функция

v = v0 + aconst*t
v - скорость
a - ускорение
t - время от начального момента

дистанция рассчитывается через интеграл (надеюсь понятно в такой записи)

d(t) = integral( v(t)dt, t0, t);

если заменить расчет через delta_t, то получим

delta_t = ti-ti-1
d += v(ti) * delta_t

реально же через интегралы

d += v(ti) * delta_t + ( aconst * delta_t2) / 2

Чем больше delta_t тем больше ошибка.

Оба варианта являются конечной разностью интеграла полученной при разложении в ряд Тейлора функции дистанции по времени.
Первый соответствует постоянной скорости (ускорение 0), второй постоянному ускорению (сила воздействия не изменяется).
Ряд сходящийся, сумма остаточных членов ряда - погрешность вычислений.

В случае когда сила воздействия зависит от положения самого тела необходимо иметь градиент потенциала, дивергенцию скорости и ..., собственно решать диф. уравнения.
Простой подгон не даст решения на все случаи.

Для подгона могу предложить только определять силу воздействия не по мгновенному значению, а по формуле

F0 = F(t0);
F1 = F(t1);

F = ( F0 * w0 + F1 * w1 ) / ( w0 + w1 );

и подбирать веса w, чтобы все выглядела достаточно прилично.
565  Qt / Кладовая готовых решений / Re: Обертка контейнеров прямого доступа : Ноябрь 06, 2015, 10:13
Это, скорее всего, из более раннего периода C++, когда отсутствовал auto в том виде, как он сейчас используется, и std::begin/std::end.
566  Программирование / Алгоритмы / Re: Потенциал Леннард-Джонса : Ноябрь 06, 2015, 10:00
Наверное, без интегрирования все же не обойдется.
Задача о гравитационном взаимодействии двух тел имеет аналитическое решение (отталкивание - гравитация с отрицательным знаком).
Для трех и более - необходимо использовать численные методы, что в данном случае не оправдано.
Можно посмотреть в сторону моделирования частиц с помощью GPU (PhysX), там такие же задачи решаются.
567  Qt / Кладовая готовых решений / Re: Обертка контейнеров прямого доступа : Ноябрь 06, 2015, 09:52
В данном случае Array - это обертка вокруг Raw массива, как раз для того, чтобы для него можно было использовать интерфейс итераторов.
568  Программирование / С/C++ / Re: first, second : Ноябрь 02, 2015, 12:37
... Или tuple и enum'ом элементы обзови.

Самое корректное решение будет, к тому же легко расширяемое.

569  Программирование / С/C++ / Re: 2 мапы и вумные указатели : Октябрь 28, 2015, 15:20

Может в самом Value хранить итератор map2? Хорошего впечатления не производит... 
[/quote]

После изменения состава map2, хранимый итератор может стать невалидным.
570  Программирование / С/C++ / Re: 2 мапы и вумные указатели : Октябрь 28, 2015, 13:46
Можно хранить в map2 shared_ptr< Value >, а в map1 weak_ptr< Value >, тогда удаление Value из map2 приведет к обнулению указателя weak_ptr в map1.
Только это кажется нерациональным, так как пустые weak_ptr "зависнут" в map1, но все зависит от контекста решаемой задачи.
Страниц: 1 ... 36 37 [38] 39

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