在上一篇介绍了多线程和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. Spring Boot - StateMachine状态机

    是Spring Boot提供的状态机的现成实现. 理论(有点像工作流) 需要定义一些状态的枚举,以及一些引起状态变化的事件的枚举. 每个状态可以对应的创建一个继承自org.springframewor ...

  2. 浅谈.NET,C#三层架构(自己总结)

     三层架构 常见架构: 三层(经典) MVC MVVM MVP   开发中常见的23种设计模式: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种: ...

  3. Spring 开发第一步(三)Spring与JDBC

    <spring in action 3rd>中的前面4章讲解的是Spring的核心,也就是DI/IOC和AOP .从第5章开始是Spring在企业开发中的各个方面的应用.其实作为笔者从事的 ...

  4. 600. Non-negative Integers without Consecutive Ones

    Given a positive integer n, find the number of non-negative integers less than or equal to n, whose ...

  5. UIVisualEffectView(高斯模糊效果)

    ///高斯模糊. UIView *tempView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; tempView. ...

  6. jzoj5806

    我們發現,如果有奇環顯然無解,因為我們每一次合併一個奇環,一定會產生一個偶環和一個更小的奇環,最終會形成一個三元環而無法合併 所以,這個圖需要是一個二分圖,需要進行二染色 然後把這個圖所有的偶環找出來 ...

  7. 伸展树的实现——c++

     一.介绍 伸展树(Splay Tree)是一种二叉排序树,它能在O(log n)内完成插入.查找和删除操作.它由Daniel Sleator和Robert Tarjan创造.(01) 伸展树属于二叉 ...

  8. GPS欺骗(一)—无人机的劫持

    本文作者:唯念那抹瑞利蓝 今天我们所讲的是GPS欺骗的方式和简单的定义.让大家对GPS欺骗这个方面有所了解.GPS是全世界地一个卫星定位系统,由美国制造. 0×01 例子2011年伊朗劫持美国无人机 ...

  9. 转载-浅谈Ddos攻击攻击与防御

    EMail: jianxin#80sec.comSite: http://www.80sec.comDate: 2011-2-10From: http://www.80sec.com/ [ 目录 ]一 ...

  10. iOS根据图片url获取尺寸

    可以在UIImage的分类中加入下面的代码,并且引入系统的ImageIO.framework /** 根据图片的url获取尺寸 @param URL url @return CGSize */ + ( ...