unity中多线程Socket通信,unity假死(未响影)
(2014-10-13 13:25:20)
转载▼
分类: unity |
有几日,主程用.net的socket做网络通信的小demo,用了一个简单的socket,两个线程,一个接收线程,一个发送线程。
代码大概这样:
01
try
02 {
03 Connector . ip = this . ip;
04 Connector . port = this . port;
05 SendThread st = new SendThread();
06 ThreadStart ts = new ThreadStart( st . run);
07 t = new Thread( ts);
08 t . Start();
09
10 ReceiveThread rt = new ReceiveThread();
11 ThreadStart ts2 = new ThreadStart( rt . run);
12 t2 = new Thread( ts2);
13 t2 . Start();
14 }
15 catch ( Exception)
16 {
17 print( "连接出错");
18 }
02 {
03 Connector . ip = this . ip;
04 Connector . port = this . port;
05 SendThread st = new SendThread();
06 ThreadStart ts = new ThreadStart( st . run);
07 t = new Thread( ts);
08 t . Start();
09
10 ReceiveThread rt = new ReceiveThread();
11 ThreadStart ts2 = new ThreadStart( rt . run);
12 t2 = new Thread( ts2);
13 t2 . Start();
14 }
15 catch ( Exception)
16 {
17 print( "连接出错");
18 }
Connecto是封装了.ne socket的一个单例。看起来没有什么问题,运行也正常。但是第二次运行的时候,unity编辑器就假死(未影响)了。开始以为是mono支持的.net版本问题,最后发现是unity在关闭调试的时候程序的线程没有关闭。应该是unity单线程中,多线程不没控制。之前的socket还连接着的,第二次再次连接让socket阻塞,导致unity假死。
解决方法:
void
OnDestroy
(){
t
.
Abort ();
t2
.
Abort ();
conn
.
Close();
}
只要在unity销毁对象的时候,把线程kill就行了。当然是在OnDestroy()了。但是主程说好像kill不了,线程有保护什么的(这里反正我不懂-_-!!)。之后在OnDestroy()里把之前的socket给断开。
这样就可以了。
不过有时候还是会假死,不知道是多线程的问题还是unity本身的问题,但是概率低了很多,基本比你电脑死机高一点。