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

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа приложения вызывает полную загрузку одного ядра. Как пофиксить???  (Прочитано 3066 раз)
korel
Гость
« : Ноябрь 09, 2010, 12:29 »

Приложение использует кастомные контролы для которых переопределены ивенты paintEvent, enterEvent, leaveEvent, mouseReleaseEvent, mousePress, resizeEvent. Я предполагаю, что непосредственно это (т.е. большое количество происходящих ивентов) влияет на загруженность проца. Хотелось бы знать, что в таком случае нужно делать? Может быть есть какие-то, способы понизить загруженность ядра ЦПУ.
Записан
SABROG
Гость
« Ответ #1 : Ноябрь 09, 2010, 12:32 »

Я предполагаю, что непосредственно это (т.е. большое количество происходящих ивентов) влияет на загруженность проца. Хотелось бы знать, что в таком случае нужно делать? Может быть есть какие-то, способы понизить загруженность ядра ЦПУ.

Вероятно, для того чтобы сдвинуть дело с мертвой точки, было бы неплохо увидеть исходники приложения.
Записан
ufna
Гость
« Ответ #2 : Ноябрь 09, 2010, 12:33 »

+1

Дело не в самих эвентах, а возможно как они реализованы
Записан
merke
Гость
« Ответ #3 : Ноябрь 09, 2010, 12:40 »

Исходники в студию!!!
Записан
korel
Гость
« Ответ #4 : Ноябрь 09, 2010, 12:44 »

signatureButton.h

Код:
#pragma once

#include <QtGui/QAbstractButton>
#include <QtDesigner/QDesignerExportWidget>
#include "signature_lib.h"

class QMenu;
 
class SIGNATURECOLLECTION_EXPORT SignatureButton : public QAbstractButton
{
    Q_OBJECT
    Q_PROPERTY(QIcon normal_state_icon READ GetNormalStateIcon WRITE SetNormalStateIcon)
    Q_PROPERTY(QIcon active_state_icon READ GetActiveStateIcon WRITE SetActiveStateIcon)

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

    QSize sizeHint() const;

    void SetMenu(QMenu* i_menu);
    void ShowMenu() const;
    void AddActions(QList<QAction*> i_actions);

    ////////////////////////////////////////////////
    void SetNormalStateIcon(const QIcon& i_icon)
      {
      if(m_normal_state_icon.isNull())
        {
        m_normal_state_icon = i_icon;
        setIcon(m_normal_state_icon);
        }
      return;
      }

    void SetActiveStateIcon(const QIcon& i_icon)
      {
      if(m_active_state_icon.isNull())
        m_active_state_icon = i_icon;
      return;
      }

    const QIcon& GetNormalStateIcon()
      {
      return m_normal_state_icon;
      }

    const QIcon& GetActiveStateIcon()
      {
      return m_active_state_icon;
      }

    bool IsActive() const;
    ///////////////////////////////////////////////

public slots:
    void ChangeState();

protected:
  void paintEvent(QPaintEvent *e)
  void mouseReleaseEvent(QMouseEvent* e);
  void mousePressEvent(QMouseEvent* e);//todo check for needing of this event method
  void enterEvent(QEvent*);
  void leaveEvent(QEvent*);

private:
    bool m_is_active;
       
    QIcon m_normal_state_icon;
    QIcon m_active_state_icon;

    QMenu* mp_menu;

signals:
    void mousePressed();
    void mouseReleased();
  };


signatureBitton.cpp
Код:
#include "signaturebutton.h"

#include <QMenu>
#include <QPainter>
#include <QtCore>
#include <QObject>
#include <QMouseEvent>
#include <QImage>
#include <QtGui/QMessageBox>

SignatureButton::SignatureButton(QWidget *parent) : QAbstractButton(parent),
                                              m_is_active(false),
                                              mp_menu(NULL)
  {
    setStyleSheet("font-family: Verdana;"
                  "font-size: 12px;"
                  "font-weight: bold;"
    );
  }

SignatureButton::~SignatureButton()
  {}

QSize SignatureButton::sizeHint() const
  {
  if(icon().isNull())
    return QSize(fontMetrics().width(text()) + 10, fontMetrics().height() + 10);
  else
    return icon().actualSize(QSize(300, 100));
  }

void SignatureButton::SetMenu(QMenu* i_menu)
  {
  mp_menu = i_menu;
  }

void SignatureButton::ShowMenu() const
  {
  QPoint button_global_point = parentWidget()->mapToGlobal(QPoint(pos().x(), pos().y()));
  QPoint menu_global_point = QPoint(button_global_point.x(),
                                    button_global_point.y() + frameGeometry().height());

  mp_menu->popup(menu_global_point);
  }

void SignatureButton::AddActions(QList<QAction*> i_actions)
  {
  if(!i_actions.isEmpty())
    mp_menu->addActions(i_actions);
  }

bool SignatureButton::IsActive() const
  {
  return m_is_active;
  }

void SignatureButton::ChangeState()
  {
  m_is_active = !m_is_active;
  }

/////////////////////////////////////////////////////////////

void SignatureButton::paintEvent(QPaintEvent* e)//todo - check
  {
  QPainter painter(this);
  if(m_is_active && !icon().isNull() && m_normal_state_icon.name() == icon().name())
    setIcon(m_active_state_icon);
  else if(!m_is_active && !icon().isNull() && icon().name() == m_active_state_icon.name())
    setIcon(m_normal_state_icon);
 
  icon().paint(&painter, rect(), Qt::AlignCenter, QIcon::Mode::Normal, QIcon::State::On);
 
  if(!text().isEmpty())
    painter.drawText( rect(), Qt::AlignCenter, text());
  }

void SignatureButton::enterEvent(QEvent*)
  {
  m_is_active = true;
  }

void  SignatureButton::leaveEvent(QEvent*)
  {
  m_is_active = false;
  }

void SignatureButton::mouseReleaseEvent(QMouseEvent* e)
  {
  if(e->button() == Qt::LeftButton)
    {
    m_is_active = false;
    emit mouseReleased();//todo check
    repaint(rect());
    if(mp_menu)
      ShowMenu();
    }
  }

void SignatureButton::mousePressEvent(QMouseEvent* e)
  {
  emit mousePressed();
  }

signatureEditBox.h

Код:
#pragma once

#include <QtGui/QWidget>
#include <QtCore/QtGlobal>
#include "editbox.h"
#include "signature_lib.h"

#define EBID_MINUS 1
#define EBID_PLUS  2

class QHBoxLayout;
class QSignalMapper;
class EditBox;
class QResizeEvent;

class SIGNATURECOLLECTION_EXPORT SignatureEditBox : public QWidget
  {
  Q_OBJECT
  Q_PROPERTY(QIcon minus_normal_state_icon READ GetMinusNormalStateIcon WRITE SetMinusNormalStateIcon)
  Q_PROPERTY(QIcon minus_active_state_icon READ GetMinusActiveStateIcon WRITE SetMinusActiveStateIcon)

  Q_PROPERTY(QIcon edit_normal_state_icon READ GetEditNormalStateIcon WRITE SetEditNormalStateIcon)
  Q_PROPERTY(QIcon edit_active_state_icon READ GetEditActiveStateIcon WRITE SetEditActiveStateIcon)

  Q_PROPERTY(QIcon plus_normal_state_icon READ GetPlusNormalStateIcon WRITE SetPlusNormalStateIcon)
  Q_PROPERTY(QIcon plus_active_state_icon READ GetPlusActiveStateIcon WRITE SetPlusActiveStateIcon)

  Q_PROPERTY(QString text READ GetText WRITE SetText)

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

    //accessors for Q_PROPERTY(...)
    void SetMinusNormalStateIcon(const QIcon& i_icon)
      {mp_minus->SetNormalStateIcon(i_icon);}
    void SetMinusActiveStateIcon(const QIcon& i_icon)
      {mp_minus->SetActiveStateIcon(i_icon);}

    void SetEditNormalStateIcon(const QIcon& i_icon)
      {mp_editbox->SetNormalStateIcon(i_icon);}
    void SetEditActiveStateIcon(const QIcon& i_icon)
      {mp_editbox->SetActiveStateIcon(i_icon);}

    void SetPlusNormalStateIcon(const QIcon& i_icon)
      {mp_plus->SetNormalStateIcon(i_icon);}
    void SetPlusActiveStateIcon(const QIcon& i_icon)
      {mp_plus->SetActiveStateIcon(i_icon);}

    const QIcon& GetMinusNormalStateIcon()
      {return mp_minus->GetNormalStateIcon();}
    const QIcon& GetMinusActiveStateIcon()
      {return mp_minus->GetActiveStateIcon();}

    const QIcon& GetEditNormalStateIcon()
      {return mp_editbox->GetNormalStateIcon();}
    const QIcon& GetEditActiveStateIcon()
      {return mp_editbox->GetActiveStateIcon();}

    const QIcon& GetPlusNormalStateIcon()
      {return mp_plus->GetNormalStateIcon();}
    const QIcon& GetPlusActiveStateIcon()
      {return mp_plus->GetActiveStateIcon();}
    ////////////////////////////////////////////////////

    void SetText(const QString& i_text)
      {mp_editbox->setText(i_text);}

    const QString GetText() const
      {return mp_editbox->text();}

    QSize sizeHint() const;//todo reimplement

    void SetEditBoxText(const QString& i_text);
    void Compose();

  protected:
    void resizeEvent(QResizeEvent*);

  private:
    SignatureButton* mp_minus;
    EditBox* mp_editbox;
    SignatureButton* mp_plus;

    QSignalMapper* mp_signal_press_mapper;
    QSignalMapper* mp_signal_release_mapper;

  public slots:
    void ChangeEditState(int i_button_id);
  };


signatureEditBox.cpp

Код:
#include "signatureeditbox.h"

#include <QHBoxLayout>
#include <QSignalMapper>
#include <QString>
#include <QPainter>
#include <QResizeEvent>

SignatureEditBox::SignatureEditBox(QWidget *parent) : QWidget(parent),
                                                      mp_minus(new SignatureButton),
                                                      mp_editbox(new EditBox),
                                                      mp_plus(new SignatureButton),
                                                      mp_signal_press_mapper(new QSignalMapper),
                                                      mp_signal_release_mapper(new QSignalMapper)
  {
  mp_minus->setParent(this);
  mp_editbox->setParent(this);
  mp_plus->setParent(this);

  //signal mapping block
  mp_signal_release_mapper->setParent(this);
  mp_signal_release_mapper->setMapping(mp_minus, EBID_MINUS);
  mp_signal_release_mapper->setMapping(mp_plus, EBID_PLUS);

  connect(mp_minus, SIGNAL(mouseReleased()), mp_signal_release_mapper, SLOT(map()));
  connect(mp_plus, SIGNAL(mouseReleased()), mp_signal_release_mapper, SLOT(map()));

  mp_signal_press_mapper->setParent(this);
  mp_signal_press_mapper->setMapping(mp_minus, EBID_MINUS);
  mp_signal_press_mapper->setMapping(mp_plus, EBID_PLUS);

  connect(mp_minus, SIGNAL(mousePressed()), mp_signal_press_mapper, SLOT(map()));
  connect(mp_plus, SIGNAL(mousePressed()), mp_signal_press_mapper, SLOT(map()));

  connect(mp_signal_press_mapper, SIGNAL(mapped(int)), this, SLOT(ChangeEditState(int)));
  connect(mp_signal_release_mapper, SIGNAL(mapped(int)), this, SLOT(ChangeEditState(int)));
  }

QSize SignatureEditBox::sizeHint() const
  {
  return QSize(mp_minus->sizeHint().width() +  mp_editbox->sizeHint().width() + mp_plus->sizeHint().width() + 10, mp_plus->sizeHint().height());
  }

//in application window: after loading all icons - call resize() for SignatureEditBox
void SignatureEditBox::resizeEvent(QResizeEvent* ip_event)
  {
  //sizeHint using implementation
  int pure_edit_width = ip_event->size().width() - 10;
  int pure_edit_height = ip_event->size().height() - 5;//5 - top distance to components

  int width = pure_edit_width * mp_minus->sizeHint().width() / (sizeHint().width() - 10);
  int a = mp_minus->sizeHint().height();
  int b = (sizeHint().height() - 5);
  int height = pure_edit_height * a / b;

  int offset = 0;
  mp_minus->setGeometry(offset += 3, mp_minus->y(), width, height);

  width = pure_edit_width * mp_editbox->sizeHint().width() / (sizeHint().width() - 10);
  height = pure_edit_height * mp_editbox->sizeHint().height() / (sizeHint().height() - 5);
  mp_editbox->setGeometry(offset += mp_minus->width() + 2, mp_editbox->y(), width, height);

  width = pure_edit_width * mp_plus->sizeHint().width() / (sizeHint().width() - 10);
  height = pure_edit_height * mp_plus->sizeHint().height() / (sizeHint().height() - 5);
  mp_plus->setGeometry(offset += mp_editbox->width() + 2, mp_plus->y(), width, height);
  }

/////////////////////////////////////////////////////////////////////
void SignatureEditBox::SetEditBoxText(const QString& i_text)
  {
  mp_editbox->setText(i_text);
  }

SignatureEditBox::~SignatureEditBox()
  {}

void SignatureEditBox::ChangeEditState(int i_button_id)
  {
  if(!mp_editbox->IsActive() && !mp_editbox->text().isNull())
    {
    QStringList list = mp_editbox->text().split(" ");
    QString val_str = list.at(0);
    double val = val_str.toDouble();
    QString str = list.at(1);

    switch(i_button_id)
      {
      case EBID_MINUS:
        mp_editbox->setText(QString::number((double)(val - 0.5)) + " " + str);
        break;
      case EBID_PLUS:
        mp_editbox->setText(QString::number((double)(val + 0.5)) + " " + str);
        break;
      }
    }

  mp_editbox->ChangeState();
  update(mp_editbox->rect());
  }
Записан
SABROG
Гость
« Ответ #5 : Ноябрь 09, 2010, 13:37 »

Приложение грузит процессор вообще постоянно или на какие-то действия пользователя? Собираешь под Windows или Linux? Под последним можно Callgrind'ом найти проблемные места.
Записан
korel
Гость
« Ответ #6 : Ноябрь 09, 2010, 14:33 »

Приложение грузит процессор вообще постоянно или на какие-то действия пользователя? Собираешь под Windows или Linux? Под последним можно Callgrind'ом найти проблемные места.

Я уже все пофиксил Смеющийся. проблема была в том, что paintEvent устанавливал айконы самостоятельно. Я вынес этот кусок кода в отдельный метод. Оставил в paintEvent только отрисовку и вуаля!!!! Все заработало коректно.

Код:
void SignatureButton::SetActive(bool i_state)
  {
  m_is_active = i_state;

  if(m_is_active && !icon().isNull() && m_normal_state_icon.name() == icon().name())   
    setIcon(m_active_state_icon);
  else if(!m_is_active && !icon().isNull() && icon().name() == m_active_state_icon.name())
    setIcon(m_normal_state_icon);
  }

void SignatureButton::paintEvent(QPaintEvent* e)//todo - check
  {
  QPainter painter(this);
 
  icon().paint(&painter, rect(), Qt::AlignCenter, QIcon::Mode::Normal, QIcon::State::On);
 
  if(!text().isEmpty())
    painter.drawText( rect(), Qt::AlignCenter, text());
  }
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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