Python 板


LINE

※ 引述《tyc5116 (累人啊....)》之铭言: : 如题,有两个问题,参考官方的文件 : https://docs.python.org/3.3/library/socketserver.html : 基本的通讯没问题,但有讯息截取的问题 : 官方文件是将接收到的文件直接print出来,我现在想要的是 : self.Server = socketserver.TCPServer((HOST, PORT), MyTCPHandler) : self.m_thread_Monitor.start()-->会启动thread, : 内有无限回圈执行server.serve_forever() : ... : aaa = server.getrecvdata()-->类似这样将server接收到的传出来 : print(aaa) : 不知该如何修改? : 以及另一个问题,我以为将上述的宣告改为 : self.Server = : socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) : 会直接帮我们处理thread的问题,但是主视窗还是会卡住 : 请问该怎麽改? 我先确认一下 所以你的需求应该是, 有个 GUI 程式想跑一个 TCP server 然後想让它在背景跑(不会 block GUI thread) 并且把收到的东西传给别人(例如显示在视窗上)这样? 建议在问问题的时候直接讲你要什麽, 而不是问「这个东西要怎麽做」 因为你理解的解法可能根本就不对, 这样别人给你的建议也会完全错误 如果你直接说「想要什麽」与「现在有什麽」, 沟通会比较顺利 回到原本的问题, 假设你真的是要这两个东西 第一个需求的解法就是开 thread 来处理, 这个方向没错 但 ThreadingTCPServer 是会在每次呼叫 handle() 的时候开 thread(文件有提到) 虽然它的 handle() 不会 block GUI thread, 但在等 request 的时候仍然会 所以你需要的其实是把 serve_forever() 丢到 background thread 里面 这个其实文件也有提到怎麽做, 请看最後面那个 asynchronous 范例 第二个需求就比较麻烦一点, 因为你必须把收到的资料从背景传回 GUI thread 这通常会用 queue 来达成 https://docs.python.org/3/library/queue.html 你需要建立一个 queue, 然後在收到资料时丢给它 msg_q = queue.Queue() class MyTCPRequestHandler(sockerserver.BaseRequestHandler): def handle(self): data = self.request.recv(1024) msg_q.put(data) # 後略 然後在 GUI thread 从这个 queue 里面拿东西出来 要什麽时候拿就是个学问, 简单的方法可以用一个 timer 来做 例如 (以下假码, 请根据你用的 GUI framework 修改) class MyWindow(gui.Window): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.timer = gui.Timer( # 每 0.1 秒呼叫 self.timeout timeout=0.1, callback=self.timeout, repeat=True, ) self.timer.start() def timeout(self): try: # 试着拿收到的资料出来, 如果没有就算了 data = msg_q.get_nowait() except queue.Empty: pass else: # 在这里把 data 显示到你要的地方 架构大概是长这样 剩下的就先试着自行参透吧 -- ╱ ̄ ̄ ̄╲ ▏◢█◣ 成龙表示: 是喔... ′/ ‵ ╰╯ ψQSWEET █◤ --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.161.94.175
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1465755520.A.93A.html ※ 编辑: uranusjr (218.161.94.175), 06/13/2016 02:23:47
1F:推 tyc5116: msg_q是属於MyTCPRequestHandler or MyWindow的属性? 06/13 14:37
2F:→ tyc5116: 或是全域变数?这应该是我这个问题的主要疑问点 06/13 14:37
3F:→ uranusjr: 全域变数就可以了, 你要把它放进哪个 class 也没差, 只 06/13 15:27
4F:→ uranusjr: 要确定两个 queue 变数指向同一个 instance 就好 06/13 15:27







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP