2014-04-15 38 views
0

我试图编辑键盘IO示例http://twistedmatrix.com/documents/current/core/examples/stdin.py,以便在发生实时情节时键入命令并更改绘图。我有以下简单的代码。为什么不用扭曲的键盘示例与线程一起工作?

import random, pylab, threading, signal, time 
from twisted.internet import stdio 
from twisted.protocols import basic 
from twisted.internet import reactor 

# Start interactive mode 
pylab.ion() 
# Initialize lock semaphore 
lock = threading.Lock() 
line, = pylab.plot([], []) 

class Echo(basic.LineReceiver): 

    def connectionMade(self): 
     self.transport.write('>>> ') 

    def lineReceived(self, line): 
     # This doesn't seem to execute. 
     self.sendLine('Echo: ' + line) 
     self.transport.write('>>> ') 

def Update(): 
    # Thread for updating plot 
    while True: 
     lock.acquire() 
     pylab.draw() 
     lock.release() 
     time.sleep(0.2) 

def AddData(): 
    # Thread for adding data 
    while True: 
     lock.acquire() 
     x = -1.0 + 2.0 * random.random() 
     y = -1.0 + 2.0 * random.random() 
     pylab.plot(x, y, '+g') 
     lock.release() 
     time.sleep(0.5) 

def main(): 
    stdio.StandardIO(Echo()) 
    reactor.callInThread(AddData) 
    reactor.callInThread(Update) 
    reactor.run() 

if __name__ == '__main__': 
    main() 

为什么在添加绘图代码时不会调用lineReceived

回答

2

最简单的问题是,你的LineReceiver没有定义分隔符伊娃,这可能是固定的:

from os import linesep 

class Echo(basic.LineReceiver): 
    delimiter = linesep 

注:正如所发布的,这是Twisted的一个非常奇怪的用途,因为它增加了复杂性,但不会为你购买任何东西。我明白这可能是一个草图,但是您可能想要重新考虑使用Twisted,或者在Twisted应用程序中以这种方式使用线程。您也可以考虑使用Twisted的GTK2反应器来让事件循环与Matplotlib更自然地结合。

+0

我知道,StandardIO只是一个占位符。它最终将成为一个UDP监听器。 – nickponline

+0

它是'StandardIO'的事实并不真正影响奇怪。 – Glyph

+0

建议等待更新matplotlib图时处理网络事件是什么? – nickponline

相关问题