2011-02-06 8 views
3

私は繰り返し繰り返しの設定可能な遅延と番号で電話番号にメッセージを送信するためにユーザを可能にするGUIプログラムを書いています。使用gobject.timeout_add_seconds - セグメンテーションフォールト

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

私は新しいメッセージは、すべての1秒を送信する必要があるかどうかを確認するためにgobject.timeout_add_secondsを使用しようとしていますが、それはセグメンテーションフォールトを引き起こしているとき。

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_()) 

答えて

3

あなたは(PY)Qtアプリケーション内(PY)GTKタイマーオブジェクトを使用しているように見える。それが参考になる場合、私はあまりにもGUIコードを含めることができます。私はgobject.timeout_add_secondsを使用してセグメンテーション違反を再現することができた、と私はPyQtは1とPyGTKのタイマーを交換したら、それは去っていきました同等のPyQtコード

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

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

を交換してみてください。これがなぜ起こるか私は確認することはできませんが、this articleが可能な理由を与える:私が見つけ

1つの警告、gobject.timeout_add_seconds()はGTKのメインループに依存しているようですので、あなたが定期的にそれを使用することはできません非GTKのPythonアプリケーションです。

+0

ありがとうございました!これはまさに私が必要としたものでした。 – xur17

関連する問題