• 修改Zenject下ProfileBlock.cs源码, 取消有关UnityEngine.Profiling.Profiler的代码.
  • 然后使用Zenject的Signal:
   // 定义Signal
public class TestCrossThreadCommEvent : Signal<string, TestCrossThreadCommEvent> { }
   // Install Signals
Container.DeclareSignal<TestCrossThreadCommEvent>();
 // 启动线程
tth = new Thread(() =>
{
while (true)
{
Thread.Sleep();
_crossThreadCommEvent.Fire("fire not in main thread");
//_unityEvent.Invoke();
}
});
tth.Start();
// UniRx
_crossThreadCommEvent.AsObservable.ObserveOnMainThread(MainThreadDispatchType.Update)
// 使用lambda表达式是没有问题的
.Subscribe(s => TestCrossThreadComm(s))
.AddTo(this); void TestCrossThreadComm(string msg)
{
Debug.Log(Thread.CurrentThread.ManagedThreadId);
Debug.Log(msg);
transform.RotateAround(transform.position, Vector3.up, 5f);
}
  • 输出结果:

  1

      UnityEngine.Debug:Log(Object)

      fire not in main thread

  UnityEngine.Debug:Log(Object)

 
  • 多个参数情况:
 // 定义Signal
public class TestCrossThreadCommEvent : Signal<string, string, TestCrossThreadCommEvent> { }
 // Install Signals
Container.DeclareSignal<TestCrossThreadCommEvent>();
 // 启动线程
tth = new Thread(() =>
{
while (true)
{
Thread.Sleep();
_crossThreadCommEvent.Fire("fire not in main thread", "\t so happy.");
//_unityEvent.Invoke();
}
});
tth.Start();
// UniRx-Lambda
_crossThreadCommEvent.AsObservable.ObserveOnMainThread(MainThreadDispatchType.Update)
// 使用lambda表达式是没有问题的
.Subscribe(tuple =>
{
Debug.Log(Thread.CurrentThread.ManagedThreadId);
Debug.Log(tuple.Item1 + tuple.Item2);
transform.RotateAround(transform.position, Vector3.up, 5f);
})
.AddTo(this);
  • 输出结果:
1
UnityEngine.Debug:Log(Object)
fire not in main thread     so happy.
UnityEngine.Debug:Log(Object)
 
以上为Asset Store中Zenject早期版本.
目前有版本对Signal部分改动如下:
 ...
#if UNITY_EDITOR && ZEN_PROFILING_ENABLED
using (ProfileBlock.Start("Signal '{0}'", this.GetType().Name))
#endif
{
var wasHandled = Manager.Trigger(SignalId, new object[]); wasHandled |= (_listeners.Count > ); // Iterate over _tempListeners in case the
// listener removes themselves in the callback
// (we use _tempListeners to avoid memory allocs)
_tempListeners.Clear(); for (int i = ; i < _listeners.Count; i++)
{
_tempListeners.Add(_listeners[i]);
} for (int i = ; i < _tempListeners.Count; i++)
{
var listener = _tempListeners[i]; #if UNITY_EDITOR && ZEN_PROFILING_ENABLED
using (ProfileBlock.Start(listener.ToDebugString()))
#endif
{
listener();
}
} #if ZEN_SIGNALS_ADD_UNIRX
wasHandled |= _observable.HasObservers;
#if UNITY_EDITOR && ZEN_PROFILING_ENABLED
using (ProfileBlock.Start("UniRx Stream"))
#endif
{
_observable.OnNext(Unit.Default);
}
#endif
...

涉及到ProfileBlock的使用ZEN_PROFILING_ENABLED来开启, 所以想用Signal跨线程通信,否决掉ZEN_PROFILING_ENABLED就可以了.

Zenject与UniRx结合实现跨线程通信Signal的更多相关文章

  1. ZeroMq实现跨线程通信

    ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码,现在就将阅读的心得与成果记录一下,并重新模仿实现了一下经理的异步队列. 1.对外接口 //主要接口(1)void ...

  2. samephore()信号量跨线程通信

    samephore1: #include <stdio.h> #include <stdlib.h> #include <Windows.h> ] = " ...

  3. JNI加载Native Library 以及 跨线程和Qt通信

    Part1 Java Native Interface-JNI-JAVA本地调用 JNI标准是Java平台的一部分, 允许Java代码和其他语言进行交互; 开始实现-> Step 1) 编写Ja ...

  4. Android中线程通信的方式

    Android 跨线程通信 android 中是不允许在主线程中进行 网络访问等事情的因为UI如果停止响应5秒左右的话整个应用就会崩溃,到Android4.0 以后 Google强制规定,与网络相关的 ...

  5. 简短总结一下C#里跨线程更新UI(转)

    摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...

  6. 简短总结一下C#里跨线程更新UI

    摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...

  7. Java并发——线程安全、线程同步、线程通信

    线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...

  8. 【Chromium中文文档】跨进程通信 (IPC)

    跨进程通信 (IPC) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/I ...

  9. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇

    前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...

随机推荐

  1. Vue中富文本编辑器(vue-quill-editor)的使用

    1. 安装 npm install vue-quill-editor --save 2. 导入并挂载 import VueQuillEditor from 'vue-quill-editor' // ...

  2. JS:JS判断提交表单不能为空等验证

    这段代码在<form>中有οnsubmit="return on_submit()",如果 onsubmit ()返回 fasle,表单的元素就不会提交,即action ...

  3. Django---Django安装数据库

    前面我们介绍了如何通过Django完成数据的接收和数据交互,那么我们都知道,数据一般都是通过数据库存储的,然而我们作为测试肯定和数据库也是经常打交道的,今天就简单的介绍下,如何在windows上安装数 ...

  4. 剑指offer-面试题29-顺时针打印矩阵-矩阵

    /* 题目: 输入一个矩阵,按照从外到内顺时针的顺序依次打印每一个数字. */ /* 思路: 1.将打印矩阵看作是打印一个个从外向内的环. 2.每一个环都有一个起始节点,起始节点的坐标*2小于行数和列 ...

  5. c#枚举转字典或表格

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. cf1000E

    先缩点构造出一颗树,然后求树的直径就好 const int maxn=3e5+5; const int maxm=6e5+5; const int inf=1e9; int head[maxn],ve ...

  7. Linux 一些使用工具

    ssh 链接使用工具xshell 下载链接 http://www.onlinedown.net/soft/36383.htm 映射硬盘工具 sftpdriver 安装输入服务器之后链接 并且输入注册码 ...

  8. 在Visual Studio中将dll以资源的形式嵌入exe中

    一.Dll的优点: 1.扩展应用程序的特性 2.简化项目管理 3.有助于节省内存 4.促进资源的共享 5.促进本地化 6.有助于解决平台间的差异 7.可用于特殊目的 有关于dll及注入相关理论资料,可 ...

  9. Windows Server多用户同时远程登录

    因为工作需要,需要使用windwos作为一个远程登录跳板机,管理员对登录windwos机器再windwos的基础上连接别的机器,普通用户也可以连接windwos机器再连接别的机器,关于管理员普通用户连 ...

  10. 845. 八数码(bfs+map)

    在一个3×3的网格中,1~8这8个数字和一个“X”恰好不重不漏地分布在这3×3的网格中. 例如: 1 2 3 X 4 6 7 5 8 在游戏过程中,可以把“X”与其上.下.左.右四个方向之一的数字交换 ...