Unity主线程和子线程跳转调用(2)
在上一篇介绍了多线程和Unity交互方式,但是由于我的项目是一个unity编辑器插件项目,很显然上一篇的代码需要加以修改,在编辑器下实现Loom.
1,Editor下的没有Update这个生命周期函数,但是Ediitor提供了EditorApplication.update这个事件,自己用这个事件订阅update方法即可
2,Editor下的没有Awake OnDestory这些生命周期函数,需要自己编写方法让外部去创建、销毁Loom
3, 我的项目需要保证子线程逻辑不假死的同时又要保证同步,如下面这段伪代码,执行顺序为:DownFile1->UnityFunction1->DownFile2->UnityFunction2
Function
{
//异步在多线程下运行
Loom.RunAsync(() =>
{
//耗时函数
DownFile1(); //回到unity线程继续运行
Loom.QueueOnMainThread(()=>
{
//这个函数是unity函数
UnityFunction1();
} //耗时函数
DownFile2();
//回到unity线程继续运行
Loom.QueueOnMainThread(()=>
{
//这个函数是unity函数
UnityFunction2();
} }
}
修改后的代码如下
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.Threading;
using System.Linq;
using UnityEditor;
public class Loom
{
/// <summary>
/// 当前是否有unity任务需要执行
/// </summary>
static bool hasUnityAction = true; private static Thread loomThread; /// <summary>
/// unity任务表
/// </summary>
private List<Action> actions = new List<Action>(); #region 单例 注册update事件
private static Loom _instance;
private static readonly object lockObj = new object();
public static Loom Current
{
get
{
if (_instance == null)
{
lock (lockObj)
{
if (_instance == null)
{
_instance = new Loom();
} }
}
return _instance;
}
}
private Loom()
{
EditorApplication.update += Update; }
#endregion /// <summary>
/// 子线程启动一个任务
/// </summary>
/// <param name="a"></param>
/// <returns></returns>
public Thread RunAsync(Action a)
{
if (loomThread != null)
{
Stop();
throw new Exception("任务仅运行一次");
}
loomThread = new Thread(new ParameterizedThreadStart(RunAction));
loomThread.Name = "Loom线程";
loomThread.Priority = System.Threading.ThreadPriority.Lowest;
loomThread.Start(a);
return loomThread;
}
/// <summary>
/// 加入一个任务到主线程队列
/// </summary>
/// <param name="action"></param>
public void QueueOnMainThread(Action action)
{
if (Current != null && Thread.CurrentThread == loomThread)
{
hasUnityAction = true;
lock (Current.actions)
{
Current.actions.Add(action);
}
while (hasUnityAction)
{
loomThread.Priority = System.Threading.ThreadPriority.Lowest;
Thread.Sleep();
}
} } /// <summary>
/// 延迟子线程
/// </summary>
/// <param name="time"></param>
public void Sleep(int time)
{
if (Current != null && Thread.CurrentThread == loomThread)
{
Thread.Sleep(time); }
} /// <summary>
/// 停止任务
/// </summary>
public void Stop()
{
EditorApplication.update -= Update;
try
{
loomThread.Abort();
}
catch (Exception e)
{
Debug.Log(e.ToString());
}
finally
{
loomThread = null;
_instance = null;
} } private void RunAction(object action)
{
try
{
((Action)action)();
}
catch
{
} } List<Action> _currentActions = new List<Action>(); static void Update()
{
try
{ if (!hasUnityAction) return; lock (Current.actions)
{
Current._currentActions.Clear();
Current._currentActions.AddRange(Current.actions);
Current.actions.Clear();
}
for (int i = ; i < Current._currentActions.Count; i++)
{
Debug.LogError("主线程任务");
Current._currentActions[i](); }
hasUnityAction = false;
}
catch
{
Debug.LogError("主线程任务失败");
}
}
}
Unity主线程和子线程跳转调用(2)的更多相关文章
- Unity主线程和子线程跳转调用(1)
Unity除了一些基本的数据类型,几乎所有的API都不能在非unity线程中调用,如果项目中有一段很耗时操作,unity可能会出现“假死”.如果这段操作是和unity无关的,我们可以把这个耗时的操作放 ...
- UNIX环境高级编程——主线程与子线程的退出关系
我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下. 1. 主线程等待新线程先结束退出,主线程后退出.正常执行. 示例代码: #include & ...
- Android线程之主线程向子线程发送消息
和大家一起探讨Android线程已经有些日子了,谈的最多的就是如何把子线程中的数据发送给主线程进行处理,进行UI界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发 ...
- (转)C#/.NET主线程与子线程之间的关系
一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程. 有的博客上说“至少一个主线程”,这一说法持有怀疑 主线程与子线程之间的关系 ...
- Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解
MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...
- C#主线程等待子线程运行结束
佐左佑右 原文 C#主线程等待子线程运行结束 由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然 ...
- Handler具体解释系列(四)——利用Handler在主线程与子线程之间互发消息
MainActivity例如以下: package cc.c; import android.app.Activity; import android.os.Bundle; import androi ...
- Java主线程等待子线程、线程池
public class TestThread extends Thread { public void run() { System.out.println(this.getName() + &qu ...
- [C#参考]主线程和子线程之间的参数传递
几个进程在大多数情况下要包含很多的子线程,那么他们之间免不了的要互相传递很多的参数,那么参数怎么传递的呢? 主线程向子线程传递参数的方法 第一种方法:Thraed类有一个带参数的委托类型的重载形式,这 ...
随机推荐
- Mysql 练习题一
库操作: 1. 创建 数据库 create database db1; 2. 使用数据库 use db1 3. 查看表 show tables; 4. 删除 drop database db1 ...
- Flask系列01--flask认识, 启动, 响应
一. 四款python web框架简单总结 Django : 优点 - 大而全所有组件都是有组织内部开发高度定制化 教科书级别的框架 缺点 - 浪费资源,请求的时候需要的资源较高 Flask : 优势 ...
- C++的访问关系
1.C++的访问关系
- 深度优先搜索 - 简单demo
输入一个数n,输出 1 ~ n 的全排列,例如输入 3,全排列则为:123,132,213,231,312,321 一共六种. 这里采用深度优先搜索来解决这个问题: #include<stdio ...
- 用layui遇到过的问题
1.报错“layui.form is not a function”问题 把代码中这一串修改一下:form = layui.form(); 括号去掉就行: form = layui.form; 如果你 ...
- 【转】目标检测之YOLO系列详解
本文逐步介绍YOLO v1~v3的设计历程. YOLOv1基本思想 YOLO将输入图像分成SxS个格子,若某个物体 Ground truth 的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这 ...
- springmvc 简单框架
1.依赖 2.web.xml配置: 3.springmvc配置文件: 4.Controller 5.index.jsp页面: 6.hello.jsp 7.效果:
- VmWare扩展硬盘分区
扩展硬盘 对硬盘进行分区 () 查看现有的硬盘分区情况 [mysql@china ~]$ df -h Filesystem Size Used Avail Use% Mounted on /dev/m ...
- iOS9新特性-UIStackView
1. UIStackView相关属性理解 UIStackView是iOS9之后推出的,我也是第一次接触,在学习的过程中对于其中的相关属性,尤其是对其中的distribution几个属性值,一知半解的, ...
- POJ 1160
#include <iostream> #define MAXN 305 #define inf 123456789 using namespace std; int _m[MAXN][M ...