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 ...
随机推荐
- 【sklearn文本特征提取】词袋模型/稀疏表示/停用词/TF-IDF模型
1. 词袋模型 (Bag of Words, BOW) 文本分析是机器学习算法的一个主要应用领域.然而,原始数据的这些符号序列不能直接提供给算法进行训练,因为大多数算法期望的是固定大小的数字特征向量, ...
- codeforces 1284E
计数每一个点被被其他点组成的四边形完全包含的四边形的个数,给出的点没有三点共线的情况 官方题解如下,说的很清楚,也很有技巧 代码也是直接参考官方的题解来的 #include<bits/stdc+ ...
- Android 基础知识 -- Intent
Intent (意图) Android通信的桥梁,可以通过Intent启动Activity , Service , 发送指定广播到Receiver <1> 启动Activity : sta ...
- koa文档笔记
请求 get ctx.request.query // 查询对象 ctx.request.querystring // 查询字符串 ctx.query // 查询对象 ctx.querystring ...
- mysql常用函数及关键字汇总
关键字 1...mysql包含之in SELECT count(1) as count FROM 表名 a,表名 b WHERE a.主键 = b.外键 and a.字段 in('1','2,'3' ...
- Visual Studio Code搭建Python开发环境方法总结
更新:目前VSCode官方Python插件已经支持代码运行与调试,无需安装Code Runner插件. 1.下载安装Python,地址 https://www.python.org/downloads ...
- java - 各类OOM分析
StackOverflowError 比较常见的问题,虚拟机栈中栈帧过多超出栈容量,常见发生在递归方法深度过深. OutOfMemoryError java heap space java堆内存不足以 ...
- 2017-9-15Opencv 杂
Mat::at()的具体含义.指的是三通道.(0),(1),(2)分别表示BGR: Vector<Mat>结构的使用.将Mat类型的数据转化成了具有多个单通道的容器? 灰度图的具体含义.和 ...
- 使用ESLint+Prettier来统一前端代码风格
Prettier 简单使用 ESLint 与 Prettier配合使用 首先肯定是需要安装 prettier ,并且你的项目中已经使用了 ESLint ,有 eslintrc.js 配置文件. npm ...
- Microsoft Visual Studio 显示行号
工具下面有一个选项