Задать вопрос
@provokator2020

Почему крешится используя update и repaint?

Есть 3 функции.
1: вызывает void Qwidget::repaint ()
2: вызывает void Qwidget::update ()
Обе эти функции работают в разных потоках(чтобы 2ой поток относительно важный, не устраивал гонок 1ый поток сделал через repaint - немедленная отрисовка без построения/добавления в планировку)
3: и есть сам обработчик paintEvent в самом начале функции стоит мьютекс дабы не был краш из-за одновременного использования общих ресурсов...
Сам вопрос: почему когда я пишу update в обоих(1ом и 2ом) всё хорошо, но иногда не приходит то что важно(оно затирается), когда оба repaint у друга на компе залагивает у меня всё норм, когда я делаю как написал в пунктах(1ый и 2ой), то если в релизе всё норм, а если в дебаге то сначало начинает лагать, а потом падать в рандомных точках программы, что я делаю не так, можно ли так делать(или должно чтото одно вызываться) какие есть варианты это поправить?
UPD:
Примерно такой код:
TestClass.h:
class TestClass : public QWidget, public QObject {
    Q_OBJECT
    mutable QMutex mDataMutex;

   public:
    TestClass (QWidget *parent = 0);
    ~TestClass ();

   public slots:
    void funk_1();
    void funk_2();
};

TestClass.cpp
#include "TestClass.h"

TestClass::TestClass(QWidget *parent)
    : QWidget(parent){
    this->setWindowFlags(Qt::Widget);
    this->setAttribute(Qt::WA_PaintOnScreen);
    this->setWindowTitle("Win_1");
	this->setWindowFlags(((windowFlags() | Qt::CustomizeWindowHint) & ~Qt::WindowCloseButtonHint ));
}

void TestClass::funk_1() {
	repaint();
}

void TestClass::paintEvent(QPaintEvent* event) {
	QMutexLocker ml(&mDataMutex);

	if (mPainter.begin(this)) {
		if (!mOutFrame->isNull()) {
			mPainter.drawImage(imgPos, *Frame);
		}
		mPainter.end();
	}
}

void TestClass::funk_2() {
	update();
}

TestClass::funk_2 - вызывается примерно 50 раз в секунду, а TestClass::funk_1 - 7раз в секунду. Что за переменные:
if (!mOutFrame->isNull()) {
			mPainter.drawImage(imgPos, *Frame);
		}

Спрашивать не нужно, класс большой взял только то что касается конкретной проблемы, а так каждая переменная то что и нужно для mPainter.drawImage.
  • Вопрос задан
  • 394 просмотра
Подписаться 1 Простой 15 комментариев
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Skillbox
    Профессия Разработчик С++
 с нуля + ИИ
    7 месяцев
    Далее
Решения вопроса 1
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
Я не слишком понимаю, какую конкретно проблему вы пытаетесь решить. Если напишите, то будет легче помочь.
На всякий случай, уточню, что то что вы описали -- это следствия потенциально неправильного решения некоторой реальной проблемы. Например, для работы с анимацией уже есть готовые решения.

Касательно кода, вам как минимум надо вызывать event->accept() и к слотам func_1/2 присоединяться с аргументом Qt::QueuedConnection (а не вызывать их напрямую вроде obj->foo()). Тогда и мьютекс не понадобится.
Касательно объекта типа QPainter, его лучше создавать в обработчике события, как и рекомендуется в официальной документации.

На вопрос же "почему оно случайно падает?" ответить просто невозможно, не имея как минимум полного кода приложения, параметров компиляции, запуска и знаний об операционной системе. После этого надо собрать Qt в отладочном режиме, собрать с ним приложение и смотреть потоки в отладчике и их состояние. Но я не уверен, что это всё необходимо, принимая во внимание первый абзац. Строго говоря, проблема может быть совсем не в том участке кода, который вы привели, да и код может быть совсем другой надо написать. Очень мало данных.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Uniscan Research Новосибирск
от 140 000 до 200 000 ₽
АО НПП «АМЭ» Санкт-Петербург
До 250 000 ₽
Базис-Центр Коломна
от 70 000 до 500 000 ₽