Zenject与UniRx结合实现跨线程通信Signal
- 修改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)
- 多个参数情况:
// 定义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);
- 输出结果:

...
#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的更多相关文章
- ZeroMq实现跨线程通信
ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码,现在就将阅读的心得与成果记录一下,并重新模仿实现了一下经理的异步队列. 1.对外接口 //主要接口(1)void ...
- samephore()信号量跨线程通信
samephore1: #include <stdio.h> #include <stdlib.h> #include <Windows.h> ] = " ...
- JNI加载Native Library 以及 跨线程和Qt通信
Part1 Java Native Interface-JNI-JAVA本地调用 JNI标准是Java平台的一部分, 允许Java代码和其他语言进行交互; 开始实现-> Step 1) 编写Ja ...
- Android中线程通信的方式
Android 跨线程通信 android 中是不允许在主线程中进行 网络访问等事情的因为UI如果停止响应5秒左右的话整个应用就会崩溃,到Android4.0 以后 Google强制规定,与网络相关的 ...
- 简短总结一下C#里跨线程更新UI(转)
摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...
- 简短总结一下C#里跨线程更新UI
摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...
- Java并发——线程安全、线程同步、线程通信
线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...
- 【Chromium中文文档】跨进程通信 (IPC)
跨进程通信 (IPC) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/I ...
- 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇
前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...
随机推荐
- SQLserver 行变列。
首先看看效果是不是想要的 变成 ok,我的效果达到了.那就记录下代码吧. create table temp1(count_ int,memo nvarchar(40))go insert into ...
- JavaScript DOM–事件操作
事件 注册事件 给元素添加事件,为注册事件或者绑定事件 注册事件两种方式 传统方式 监听事件方式 事件监听 addEventListener() 事件监听 (IE9以上) eventTarget.ad ...
- dubbo的使用
dubbo现在用的也不多,基本都在用spring cloud那一套,所以不详细写这个dubbo了. 1.zookeeper的安装 2.demo示例 我们需要把提供者注册到dubbo注册中心,消费者去订 ...
- Flink架构,源码及debug
序 工作中用Flink做批量和流式处理有段时间了,感觉只看Flink文档是对Flink ProgramRuntime的细节描述不是很多, 程序员还是看代码最简单和有效.所以想写点东西,记录一下,如果能 ...
- 【29】带你了解计算机视觉(Computer vision)
计算机视觉(Computer vision) 计算机视觉是一个飞速发展的一个领域,这多亏了深度学习. 深度学习与计算机视觉可以帮助汽车,查明周围的行人和汽车,并帮助汽车避开它们. 还使得人脸识别技术变 ...
- cf1000E
先缩点构造出一颗树,然后求树的直径就好 const int maxn=3e5+5; const int maxm=6e5+5; const int inf=1e9; int head[maxn],ve ...
- Constructing Roads POJ - 2421 最小生成树板子题
#include<iostream> #include<cstring> #include<algorithm> using namespace std; ; in ...
- C#读取excel时提示“外部数据库驱动程序 (1) 中的意外错误”
- 线段树(lazy标记)-- 模板
], lazy[MAXN << ]; void PushUp(int rt) { ans[rt] = ans[rt << ] + ans[rt << | ]; } ...
- redis测试题
1.什么是Redis? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存. ...