4

私は3つのクラスを持つサーバーのクライアントとしてGUIアプリケーションを設計しています

ツイスト プロトコルのクラス、ファクトリの別のクラス、pyqt スレッド自体の 3 番目のクラス。ボタンがクリックされた場合の例として、pyqtスレッドからデータを送信するにはどうすればよいですか現在のツイスト接続を使用してコマンドを送信するにはどうすればよいですか、これが私のコードのコピーです

from OpenSSL import SSL;import sys
from twisted.internet.protocol import ClientFactory
from twisted.internet import ssl, protocol
from PyQt4 import QtCore, QtGui
from gui import Ui_clientgui

class clientgui(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_clientgui()
        self.ui.setupUi(self)

    def closeEvent(self, e):
        try:reactor.callFromThread(reactor.stop)
        except:pass

class Client(protocol.Protocol):
    def connectionMade(self):
        global server_options
        server_options['connection'] = True

    def send(self,data):
        self.transport.write(data)

    def connectionLost(self, reason):
        server_options['connection'] = False

    def dataReceived(self, line):
        print "receive:", line

class ClientFactory(ClientFactory):
    protocol = Client
    def clientConnectionFailed(self, connector, reason):
        print 'connection failed'
        try:reactor.stop()
        except:pass

if __name__ == '__main__':
    app = QtGui.QApplication([])
    import qt4reactor
    qt4reactor.install()
    from twisted.internet import reactor
    factory = ClientFactory()
    reactor.connectSSL('localhost', 8080, factory, ssl.ClientContextFactory())
    application = clientgui(reactor)
    application.show()
    reactor.runReturn()
    sys.exit(app.exec_())
4

1 に答える 1

1

qt4reactorを使用する場合、複数のスレッドをいじる必要はまったくありません。Twisted は QT スレッドで実行され、お互いのデータ構造に自由にアクセスできます。

ただし、スレッドでこれを行いたい場合、例には既にソリューションが含まれています: reactor.callFromThread. ( が であり、したがって Qt よりも Twisted の世界に住んでいるという理由ではcallFromThread(client.send)なく、実行することをお勧めします。callFromThread(transport.write)ClientProtocol

于 2012-05-23T16:45:42.377 に答える