在上一篇介绍了多线程和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)的更多相关文章

  1. Unity主线程和子线程跳转调用(1)

    Unity除了一些基本的数据类型,几乎所有的API都不能在非unity线程中调用,如果项目中有一段很耗时操作,unity可能会出现“假死”.如果这段操作是和unity无关的,我们可以把这个耗时的操作放 ...

  2. UNIX环境高级编程——主线程与子线程的退出关系

    我们在一个线程中经常会创建另外的新线程,如果主线程退出,会不会影响它所创建的新线程呢?下面就来讨论一下. 1.  主线程等待新线程先结束退出,主线程后退出.正常执行. 示例代码: #include & ...

  3. Android线程之主线程向子线程发送消息

    和大家一起探讨Android线程已经有些日子了,谈的最多的就是如何把子线程中的数据发送给主线程进行处理,进行UI界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发 ...

  4. (转)C#/.NET主线程与子线程之间的关系

    一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程.       有的博客上说“至少一个主线程”,这一说法持有怀疑         主线程与子线程之间的关系        ...

  5. Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解

    MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...

  6. C#主线程等待子线程运行结束

    佐左佑右 原文 C#主线程等待子线程运行结束 由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然 ...

  7. Handler具体解释系列(四)——利用Handler在主线程与子线程之间互发消息

    MainActivity例如以下: package cc.c; import android.app.Activity; import android.os.Bundle; import androi ...

  8. Java主线程等待子线程、线程池

    public class TestThread extends Thread { public void run() { System.out.println(this.getName() + &qu ...

  9. [C#参考]主线程和子线程之间的参数传递

    几个进程在大多数情况下要包含很多的子线程,那么他们之间免不了的要互相传递很多的参数,那么参数怎么传递的呢? 主线程向子线程传递参数的方法 第一种方法:Thraed类有一个带参数的委托类型的重载形式,这 ...

随机推荐

  1. 【打印机】argox入门

    立象dx4300打印机调试. 1 环境搭建 1.1 下载软件 登录 http://www.argox.com.cn/Pages/servicedownload.aspx 下载驱动和手册. 1.2 正常 ...

  2. 对于equals和==的理解

    很多时候equals和==大家都分不太清楚怎么样来使用,今天小编就来教大家怎么使用 equals比较的是两个变量的值是否相等 而==则比较的是这个变量的内存地址是否相同 打个比方来说 String a ...

  3. 673. Number of Longest Increasing Subsequence

    Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: I ...

  4. 理解js事件冒泡事件委托事件捕获

    js事件冒泡 javascript的事件传播过程中,当事件在一个元素上出发之后,事件会逐级传播给先辈元素,直到document为止,有的浏览器可能到window为止,这就是事件冒泡现象. <di ...

  5. Ubuntu“无法打开锁文件(Could not get lock)”问题解决

    用apt-get安装软件时提示: 无法获得锁 /var/lib/dpkg/lock - open(11:资源暂时不可用) 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它? 其 ...

  6. c++类定义和类实现

    预备知识: c++中我们cpp文件和.h文件的区别是,cpp文件是需要编译的文件,成为一个独立的编译单元,而h文件从来是不需要编译,只是用于预处理. 通常我们在cpp文件中,完成函数的实现,然后在h中 ...

  7. CPM(Cluster Percolation method)派系过滤算法

    一.概念 (1)完全子图/全耦合网络/k-派系:所有节点全部两两相连 图1 这些全耦合网络也成为派系,k-派系表示该全耦合网络的节点数目为k 1)k-派系相邻:两个不同的k-派系共享k-1个节点,认为 ...

  8. 我与GitHub的第一次——自制音乐文件修改器

    背景: 随机播放,所有的音乐播放器里面现在几乎都有这个功能吧.但是有没有发现,自己的播放器在选择随机播放的时候,经常会听到重复顺序的歌曲呢?反正我是有这样的感觉,无耐自己平时下的歌曲都是“歌手名—歌曲 ...

  9. 【数组】Rotate Image

    题目: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwis ...

  10. SPSS学习系列之SPSS Text Analytics是什么?

    不多说,直接上干货! IBM® SPSS® Text Analytics 是一个IBM® SPSS® Modeler 完全集成内插式插件,它采用了先进语言技术和Natural Language Pro ...