crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

6 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> Торможения таймера при рисовании, Python
zuze
  опции профиля:
сообщение 29.3.2013, 10:34
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Я пытаюсь закрасить область красным цветом за определённое время. Область будет закрашиватся каждый раз пока я не остановлю таймер.
Код:
# Глобальные
phi = 0.0
FlagStopRunPhi = 0
RunStopTimer = 1
timer = QtCore.QTimer()
im1 = QtGui.QImage(720, 492, QtGui.QImage.Format_ARGB32)

# В конструкторе

# Запустить таймер
self.connect(self.ui.pushButton_3, QtCore.SIGNAL("clicked()"), self.BlockTimer)

# Что происходит по таймеру
self.connect(timer, QtCore.SIGNAL("timeout()"), self.MyTimer)

def paintEvent(self, QPaintEvent):
      self.MyDraw()

# Запустить таймер
def BlockTimer(self):
            timer.start(0.05*1000)/60)

# Что происходит по таймеру
def MyTimer(self):
        global phi
        global im1

        if self.ui.checkBox_4.isChecked():
            for j in range(0, 720, 1):
                for i in range(491, -1, -1):
                    im1.setPixel(j, i, QtGui.QColor(255, 0, 0, 255).rgba())

        self.update()

        if self.ui.radioButton_2.isChecked():
            if int(self.MyRadianToGradus(phi)+0.5)*720/360 < 720:
                phi += self.MyGradusToRadian(6.0)
            else:
                phi = self.MyGradusToRadian(6.0)

# Рисуем
def MyDraw(self):
        global im1
        global phi

        Tochka = QtGui.QPainter()
        Tochka.begin(self)

        Tochka.translate(50, 50)

        Tochka.drawImage(0, 0, im1, 0, 0, int((2*self.MyRadianToGradus(phi))+0.5), 492)

        Tochka.end()


Должно быстро закрашиватся цветом, а закрашивается, только через каждые 0.5 секунды. Почему так происходит? В Qt всё быстро закрашивается.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 29.3.2013, 11:02
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


питон - интерпретатор. его скорость от 10 до 500 раз ниже, чем у кода С++, в зависимости от того, что делаешь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 29.3.2013, 11:17
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Iron Bug @ 29.3.2013, 11:02) *
питон - интерпретатор. его скорость от 10 до 500 раз ниже, чем у кода С++, в зависимости от того, что делаешь.


А можно ли в коде на Python вставить код, который однозначно показывал, что виноват сам Python, а не я?

Притом, такая простейшая операция, как закрашивание области цветом во времени. Мне не веритя, что такая простая операция затормаживает таймер в Python.

Сообщение отредактировал zuze - 29.3.2013, 11:22
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 29.3.2013, 16:57
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


если ты утверждаешь, что Qt не тормозит, то больше не на что списать тормоза, кроме как на интерфейс между Qt и питоном.

ну и реализация алгоритма весьма странная: у тебя каждый раз вызывается процедура закрашивания точки. это вызывает целую цепочку операций, в итоге идёт обращение к графической библиотеке и это происходит для каждой точки. естественно, что это тормозит. наверняка есть более быстрые методы работы с заполнением прямоугольника цветом, чтобы не делать столько длинных вызовов. кроме того, у тебя каждый раз в каждой итерации создаётся объект QColor, да ещё и с вызовом его метода, а на любое создание объекта нужно довольно много времени. питон - интерпретатор, он не умеет оптимизировать такие сложные вещи, это надо делать самому.
в общем, там много где можно опимизировать.

а для измерения времени можно попробовать навставлять таймеры и писать замеренное время в какой-то лог (только не на экран, а в память, а то ещё ужаснее будут тормоза из-за самих записей).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 3.4.2013, 15:28
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Прямоугольная область с торможениями закрашивается красным цветом. Но вот один раз я абсолютно также сделал и прямоугольная область быстро начала зарисовыватся красным цветом.
Как будто это сбой самого Pathon-а. Решил привести полный код. Может кто увидит, где может быть ошибка и отпишется.
Мой код:
# -*- coding: utf-8 -*-

from PyQt4 import QtCore, QtGui, uic
import math
import os
import struct

phi = 0.0
timer = QtCore.QTimer()
im = QtGui.QImage(720, 492, QtGui.QImage.Format_ARGB32)


class ld(QtGui.QDialog):
    def __init__(self, parent=None):
        super(ld, self).__init__(parent)
        self.ui = uic.loadUi("ld.ui", self)

        self.connect(timer, QtCore.SIGNAL("timeout()"), self.MyTimer)
        timer.start((0.005 * 1000) / 60)

    def paintEvent(self, QPaintEvent):
        if self.ui.radioButton.isChecked():
            painterRect = QtGui.QPainter(self)
            painterRect.setBrush(QtGui.QColor('black'))
            painterRect.drawRect(50, 50, 720, 492)

            self.MyDraw()

        self.update()

    def MyRadianToGradus(self, phiedit):
        gradus = phiedit * 360 / (2 * math.pi)
        return gradus

    def MyGradusToRadian(self, phiedit):
        radian = phiedit * 2 * math.pi / (360)
        return radian

    def MyTimer(self):
        global phi
        global im

        if self.ui.checkBox.isChecked():
            for j in range(0, 720, 1):
                for i in range(491, -1, -1):
                    im.setPixel(j, i, QtGui.QColor(255, 0, 0, 255).rgba())

        self.update()

        if int(self.MyRadianToGradus(phi) + 0.5) * 720 / 360 < 720:
            phi += self.MyGradusToRadian(6.0)
        else:
            phi = self.MyGradusToRadian(6.0)

    def MyDraw(self):
        global im
        global phi

        Tochka = QtGui.QPainter()
        Tochka.begin(self)

        Tochka.translate(50, 50)

        Tochka.drawImage(0, 0, im, 0, 0, int((2 * self.MyRadianToGradus(phi)) + 0.5), 492)

        Tochka.end()

if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)

    window = ld()
    window.show()

    sys.exit(app.exec_())


Сообщение отредактировал zuze - 3.4.2013, 15:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 4.4.2013, 9:20
Сообщение #6


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


timer.start((0.005 * 1000) / 60)

(0.005 * 1000) / 60 ~ 0
Поэтому таймер будет выстреливать так быстро как может, то есть постоянно.

А в обработчике таймера его ждет такой цикл:
if self.ui.checkBox.isChecked():
    for j in range(0, 720, 1):
        for i in range(491, -1, -1):
            im.setPixel(j, i, QtGui.QColor(255, 0, 0, 255).rgba())

Т.е. картинка перегенерируется постоянно, это небыстро, отсюда и тормоза.

Сообщение отредактировал lanz - 4.4.2013, 9:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 4.4.2013, 9:24
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 4.4.2013, 9:20) *
Т.е. картинка перегенерируется постоянно, это небыстро, отсюда и тормоза.


А как это поправить?

У меня даже таймер

timer.start((0.05 * 1000) / 60)


тормозит, а такой таймер необходим и в Qt работал. А почему он в Python иногда проскакивает с быстрой скоростью?

Сообщение отредактировал zuze - 4.4.2013, 9:29
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 4.4.2013, 9:50
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
А как это поправить?


Нужно картинку сгенерировать один раз, например при запуске программы.

Цитата
такой таймер необходим и в Qt работал

Может он и в Qt тормозил, 0.8 мс это очень быстро, так быстро даже курсор мыши не обновляется, 15-30 мс более разумные рамки.

Цитата
А почему он в Python иногда проскакивает с быстрой скоростью?

Может быть тысяча причин и ни на одну нельзя полагаться. Например удачно выпадает переключение процессов или байт код питоновский закешировался.
Написание приложений реального времени в Windows сродни квантовой механике :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
zuze
  опции профиля:
сообщение 4.4.2013, 10:17
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 211
Регистрация: 4.11.2012
Пользователь №: 3589

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 4.4.2013, 9:50) *
Может он и в Qt тормозил, 0.8 мс это очень быстро, так быстро даже курсор мыши не обновляется, 15-30 мс более разумные рамки.


Я сделал так

timer.start(5000)


А в место 5 секунд обновляется, через каждые 3 секунды.

Я делал так

timer.start(15)


Картинка через каждые 0,5 секунды обновляется.

Что же с этим таймером?

Сообщение отредактировал zuze - 4.4.2013, 10:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 4.4.2013, 10:37
Сообщение #10


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Если картинка не успевает обновится за 15 мс (а она наверняка не успевает) то поток блокируется до тех пор, пока она не обновится. Все это время сообщения от таймера скапливаются и будут обработаны только когда поток освободится. Поэтому и задержка, т.е. реальное время где то 0,5 секунды и быстрее не получится.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

6 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 10.11.2024, 4:25