@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.
  • Вопрос задан
  • 352 просмотра
Решения вопроса 1
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
Я не слишком понимаю, какую конкретно проблему вы пытаетесь решить. Если напишите, то будет легче помочь.
На всякий случай, уточню, что то что вы описали -- это следствия потенциально неправильного решения некоторой реальной проблемы. Например, для работы с анимацией уже есть готовые решения.

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

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

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

Похожие вопросы