• 修改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. SQLserver 行变列。

    首先看看效果是不是想要的 变成 ok,我的效果达到了.那就记录下代码吧. create table temp1(count_ int,memo nvarchar(40))go insert into ...

  2. JavaScript DOM–事件操作

    事件 注册事件 给元素添加事件,为注册事件或者绑定事件 注册事件两种方式 传统方式 监听事件方式 事件监听 addEventListener() 事件监听 (IE9以上) eventTarget.ad ...

  3. dubbo的使用

    dubbo现在用的也不多,基本都在用spring cloud那一套,所以不详细写这个dubbo了. 1.zookeeper的安装 2.demo示例 我们需要把提供者注册到dubbo注册中心,消费者去订 ...

  4. Flink架构,源码及debug

    序 工作中用Flink做批量和流式处理有段时间了,感觉只看Flink文档是对Flink ProgramRuntime的细节描述不是很多, 程序员还是看代码最简单和有效.所以想写点东西,记录一下,如果能 ...

  5. 【29】带你了解计算机视觉(Computer vision)

    计算机视觉(Computer vision) 计算机视觉是一个飞速发展的一个领域,这多亏了深度学习. 深度学习与计算机视觉可以帮助汽车,查明周围的行人和汽车,并帮助汽车避开它们. 还使得人脸识别技术变 ...

  6. cf1000E

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

  7. Constructing Roads POJ - 2421 最小生成树板子题

    #include<iostream> #include<cstring> #include<algorithm> using namespace std; ; in ...

  8. C#读取excel时提示“外部数据库驱动程序 (1) 中的意外错误”

  9. 线段树(lazy标记)-- 模板

    ], lazy[MAXN << ]; void PushUp(int rt) { ans[rt] = ans[rt << ] + ans[rt << | ]; } ...

  10. redis测试题

    1.什么是Redis? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存. ...