void SendMsgInMainThread(QNetMsg msg) { lock (this.mRecvLock) { this.mRecvWaitingMsgQueue.Enqueue(msg); } }
/// <summary> /// 提供给Lua框架的接口,运行在主线程 /// F**K lua中没有byte[],所以用string /// </summary> /// <param name="msgType"></param> /// <param name="msgData"></param> public void SendNetMsg(int msgType, byte[] msgData) { QNetMsg msg = new QNetMsg(msgType, msgData); // 发送 lock (this.mSendLock) { this.mSendWaitingMsgQueue.Enqueue(msg); Monitor.Pulse(this.mSendLock); } }
void Send() { Debug.Log("NetMgr Send Thread start!"); while (this.mIsRunning) { if (this.mSendingMsgQueue.Count == 0) { lock (this.mSendLock) { while (this.mSendWaitingMsgQueue.Count == 0) { Monitor.Wait(this.mSendLock); } Queue <QNetMsg> temp = this.mSendingMsgQueue; this.mSendingMsgQueue = this.mSendWaitingMsgQueue; this.mSendWaitingMsgQueue = this.mSendingMsgQueue; } } else { while (this.mSendingMsgQueue.Count > 0) { QNetMsg msg = this.mSendingMsgQueue.Dequeue(); try { // 拼接TLV MemoryStream stream = new MemoryStream(); // TProtocol proto = new TBinaryProtocol(new TStreamTransport(stream, stream)); // 类型 // proto.WriteI32(msg.Type); // 长度 // proto.WriteI32(msg.Length); // 值 stream.Write(msg.Data, 0, msg.Length); byte[] data = stream.ToArray(); this.mSocket.Send(data); stream.Close(); } catch (System.Exception e) { Disconnect(); } } } } this.mSendingMsgQueue.Clear(); this.mSendWaitingMsgQueue.Clear(); Debug.Log("NetMgr Send Thread is over!"); }
void Update() { if (this.mRecvingMsgQueue.Count == 0) { lock (this.mRecvLock) { if (this.mRecvWaitingMsgQueue.Count > 0) { Queue <QNetMsg> temp = this.mRecvingMsgQueue; this.mRecvingMsgQueue = this.mRecvWaitingMsgQueue; this.mRecvWaitingMsgQueue = temp; } } } else { while (this.mRecvingMsgQueue.Count > 0) { QNetMsg msg = this.mRecvingMsgQueue.Dequeue(); // 交由Lua解析并处理逻辑 // LuaMgr.Instance().CallTableFunction("NetMsgMgr", "HandleNetMsg", msg.Type, msg.Data); } } }