3

私は、ユーザーが設定可能な遅延と繰り返し回数で電話番号にメッセージを繰り返し送信できるようにするGUIプログラムを作成しています。

QT Designerを使用してGUIを作成しましたが、現在、その背後にあるコードを作成しようとしています。スタートボタンが押されたときにプログラムがメッセージの送信を開始するようにしようとしていますが、GUIをフリーズしません。

gobject.timeout_add_secondsを使用して、新しいメッセージを1秒ごとに送信する必要があるかどうかを確認しようとしていますが、セグメンテーション違反が発生している場合です。

queueMessagesは、ボタンが押されてメッセージの送信を開始するたびに呼び出されます。必要なメッセージを送信するには、sendMessagesを1秒ごとに実行する必要があります。

これを行うためのより簡単な方法(スレッド化など)があるかどうかを教えてください。私は他のアイデアを受け入れます。

該当するコードは次のとおりです。それが役立つ場合は、GUIコードも含めることができます。

#!/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_())
4

1 に答える 1

4

(Py)Qtアプリケーション内で(Py)GTKタイマーオブジェクトを使用しているようです。交換してみてください

    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)

を使用してセグメンテーション違反を再現することができましたがgobject.timeout_add_seconds、PyGTKタイマーをPyQtタイマーに置き換えると、セグメンテーション違反はなくなりました。なぜこれが起こるのかはわかりませんが、この記事には考えられる理由があります。

私が見つけた注意点の1つは、gobject.timeout_add_seconds()がGTKメインループに依存しているように見えるため、通常の非GTKpythonアプリケーションからは使用できないことです。

于 2011-02-06T18:36:55.947 に答える