Использование gobject.timeout_add_seconds - ошибка сегментации - PullRequest
3 голосов
/ 06 февраля 2011

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

Я использовал QT Designer для создания графического интерфейса, и теперь я пытаюсь создать код, стоящий за ним. Я пытаюсь заставить программу начать отправку сообщений при нажатии кнопки запуска, но не останавливать графический интерфейс.

Я пытаюсь использовать gobject.timeout_add_seconds для проверки необходимости отправки новых сообщений каждые 1 с, но когда это вызывает ошибку сегментации.

queueMessages вызывается всякий раз, когда нажимается кнопка, чтобы начать отправку сообщений, и sendMessages следует запускать каждые 1 с для отправки любых необходимых сообщений.

Дайте мне знать, если есть более простой способ сделать это (например, многопоточность). Я открыт для любых других идей.

Вот соответствующий код. Я могу также включить графический код, если это будет полезно:

#!/usr/bin/python2.5
import sys, os
import time
import gobject
from PyQt4 import QtGui,QtCore
from smsBomb import *

class MyForm(QtGui.QMainWindow):
    def __init__(self, parent=None):
        #build parent user interface
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        # Create button actions
        QtCore.QObject.connect(self.ui.btnSendMessages, QtCore.SIGNAL('clicked()'), self.queueMessages)
        # Check if we need to send any messages every 1s.
        self.maintimer = gobject.timeout_add_seconds(1, self.sendMessages)

    def queueMessages(self):
        # Queue messages!
        number = str(self.ui.txtNumber.text())
        message = str(self.ui.txtMessage.text())
        delay = int(self.ui.txtDelay.text())
        repetitions = int(self.ui.txtRepetitions.text())
        for i in range(repetitions):
            os.system('dbus-send --dest=org.QGVDial.TextServer --session --print-reply /org/QGVDial/TextServer org.QGVDial.TextServer.Text array:string:"+1' + number + '" string:"' + message + '"')
            #time.sleep(delay)

    def sendMessages(self):
        # Send Queued Messages as needed
        print "Sending queued messages..."
        return True

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = MyForm()
    myapp.show()
    sys.exit(app.exec_())

1 Ответ

4 голосов
/ 06 февраля 2011

Вы, кажется, используете (Py) объект таймера GTK в (Py) приложении Qt. Попробуйте заменить

    self.maintimer = gobject.timeout_add_seconds(1, self.sendMessages)

с эквивалентным кодом PyQt

    self.maintimer = QtCore.QTimer(self);
    self.connect(self.maintimer, QtCore.SIGNAL('timeout()'), self.sendMessages)
    self.maintimer.start(1000)

Я смог воспроизвести segfault, используя gobject.timeout_add_seconds, и он исчез, как только я заменил таймер PyGTK на PyQt. Я не могу быть уверен, почему это происходит, но эта статья дает возможную причину:

Одна оговорка, которую я нашел, gobject.timeout_add_seconds (), похоже, зависит от основного цикла GTK, поэтому вы не можете использовать его из обычного Python-приложения, не являющегося GTK.

...