buaa21 / summer2020

软件学院《程序设计实践》2020小学期仓库
40 stars 8 forks source link

socket和pygame无响应 #163

Closed dwr2001 closed 4 years ago

dwr2001 commented 4 years ago

现在我在学习socket和pygame时,已经使用thread方法解决了recv阻塞而导致无响应的问题,然后通过多线程实现了游戏和网络双开的局面,信息也能很好的传送,但在测试时,有时候可以准确迅速的传送显示,有时候就会无响应,代码完全一样,是不是我电脑的问题啊?

dwr2001 commented 4 years ago

还有,我也不是很清楚线程怎么关闭和在线程中的函数如何返回值?除了继承原来的thread类

crclz commented 4 years ago

然后就是第一个问题。光凭借你的描述我也无法确定问题出在哪里。

第二个问题:

  1. 线程如何关闭?让这个线程的函数执行完毕(return),线程就“关闭了”。具体做法就是这样:在全局设置一个变量should_cancel。我先假设你的新创建的线程的代码是无限循环的。那么,在每一次循环开始,就检测一下should_cancel是否为true,如果为true,则做清理工作,然后return。相应地,我想要关闭这个新的线程,就将should_cancel设置为true。

  2. 如何返回值?对于python,我不太清楚。可以去网上查一查资料。

dwr2001 commented 4 years ago

第一个问题我的解决方案是网络通信主线程,pygame事件获取是子线程。启动程序,然后pygame无限循环(关闭键可退出)产生的事件存在全局队列中(队列1000大小),目前还没有上锁,之后会上,然后再通信主线程中无限循环一直从队列中取元素发送,服务端接收后原信息返回,客户端再接收到后打印,有时候正常打印,有时候会卡住,代码是一样的,任务管理器我也清空了有问题的py文件

crclz commented 4 years ago

你把你的代码精简一下,剔除pygame的代码,保留通信的代码,自己debug一下,或者发出来

dwr2001 commented 4 years ago

啊,好像行了:joy:但我不知道哪里的问题,现在就是稳如dog,信息也很流畅,但如果我在关闭页面前产生很多事件,网络虽然接收到了但没有打印完,我需要怎么做呢?使用timesleep吗