Unity  Api无法从子线程访问, 但有些操作(例:IO存取文件)又必须子线程运行, 故实现在子线程做耗时操作, 完成后通知主线程更新状态

事件监听方式, 规避回调地狱:https://blog.csdn.net/qq_34987964/article/details/107318813

using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;/// <summary>
/// 子线程与主线程交互(委托实现)
/// </summary>
public class Loom : MonoBehaviour
{private static Loom _instance = null;//单例模式(此方法只能在主线程调用)public static void Instance(){if (_instance == null){var obj = new GameObject("Loom");XLuaManager.DontDestroyOnLoad(obj);obj.AddComponent<Loom>();}}//委托队列private Queue<Action> asyncQueue = new Queue<Action>();private Queue<Action> mainQueue = new Queue<Action>();//线程对象private Thread thread = null;//主线程每次Update执行Function数量private static int doUpdate = 5;void Awake(){if (_instance != null){DestroyImmediate(gameObject);return;}_instance = this;ThreadStart();}void Update(){DoFunction();}//执行Action(根据线程判断对应的方法)private void DoFunction(){if (Thread.CurrentThread == thread){if (asyncQueue.Count > 0){var func = asyncQueue.Dequeue();func();}}else{if (mainQueue.Count > 0){int number = doUpdate;do{var func = mainQueue.Dequeue();func();number--;} while (number > 0 && mainQueue.Count > 0);}}}public void AsyncFunction(Action action){asyncQueue.Enqueue(action);}public void MainFunction(Action action){mainQueue.Enqueue(action);}//停止线程public void ThreadStop(){if (thread != null && thread.IsAlive){thread.Abort();thread = null;DestroyImmediate(gameObject);}}void ThreadStart(){ThreadStop();thread = new Thread(new ThreadStart(ThreadDelegate));thread.IsBackground = true;thread.Start();}void ThreadDelegate(){while (this != null){DoFunction();}Debug.Log("Thread Done");}void OnDestroy(){Dispose();}public static void InvokeAsync(Action action){if (_instance == null){throw new Exception("未实例化Loom对象");}lock (_instance){_instance.AsyncFunction(action);}}public static void InvokeMain(Action action){if (_instance == null){throw new Exception("未实例化Loom对象");}lock (_instance){_instance.MainFunction(action);}}public static bool IsAlive(){if (_instance != null){lock (_instance){return _instance.asyncQueue.Count > 0 || _instance.mainQueue.Count > 0;}}return false;}public static void Dispose(){if (_instance != null){lock (_instance){_instance.asyncQueue.Clear();_instance.mainQueue.Clear();_instance.ThreadStop();Destroy(_instance.gameObject);_instance = null;}}}
}

Unity子线程与主线程交互(委托方式)相关推荐

  1. Qt自定义事件实现及子线程向主线程传送事件消息

    近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就 ...

  2. android Handler Message传递参数,handler子线程和主线程通讯

    创建Handler private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) { ...

  3. Python 多个线程按先后顺序执行,并保持各子线程和主线程的通信

    Python 多个线程按先后顺序执行,并保持各子线程和主线程的通信 摘要 最近有个项目使用pyqt5写的界面,界面展示部分作为项目的主线程,另外通过调用Thread,传入不同的参数又设置了五个子线程, ...

  4. 【EventBus】事件通信框架 ( 发送事件 | 判断发布线程是否是主线程 | 子线程切换主线程 | 主线程切换子线程 )

    文章目录 前言 一.根据不同的线程模式进行不同的线程切换操作 二.完整代码示例 前言 发布线程发布事件之后 , 消息中心需要转发这些事件 , 并执行相应的订阅方法 ; 在转发的过程中 , 需要针对订阅 ...

  5. Android笔记(三十一)Android中线程之间的通信(三)子线程给主线程发送消息...

    先看简单示例:点击按钮,2s之后,TextView改变内容. package cn.lixyz.handlertest;import android.app.Activity; import andr ...

  6. 19 Handler 子线程向主线程发送信息

    案例一 Message创建三种方法: package com.example.day19_handler_demo1;import android.os.Bundle; import android. ...

  7. 子线程和主线程的关系

    运行附录中test.py中的代码, 主线程和子线程啥关系? 首先多个子线程在运行的时候. 然后终端输入ps -ef|grep python 会发现: 虽然我们的脚本中是两个子线程,但是终端的监控中只能 ...

  8. MFC子线程访问主线程对话框程序的控件对象

    最近在使用 VC 开发软件时需要用到多线程同步来解决开发过程中遇到的问题.本来以为只要象控制台程序一样,在主线程创建子线程,并设置好相应的对象事件就能解决问题,但是等到真正做起来,才在实践中发现原来事 ...

  9. QT子线程与主线程的信号槽通信

    最近用QT做一个服务器,众所周知,QT的主线程必须保持畅通,才能刷新UI.所以,网络通信端采用新开线程的方式.在涉及到使用子线程更新Ui上的控件时遇到了点儿麻烦.网上提供了很多同一线程不同类间采用信号 ...

最新文章

  1. 资源监控工具Spotlight-使用说明
  2. bash循环控制语句之for循环
  3. linux下使用lftp的小结
  4. 转:3d max 2013 安装教程,凭着一种互联网精神提供给广大朋友
  5. Cmake:linux中cmake添加动态库
  6. WPF 基础控件之 DataGrid 样式
  7. jenkins配置记录(2)--代码发布流程
  8. FireMonkey 平台初探
  9. find的用法_【同步练习】高一英语下册find+复合宾语用法
  10. 第 18 章 访问者模式
  11. UVA - 11520 Fill the Square
  12. SSD,单次多框检测器Single Shot Multibox Detector,超越YOLO和Fast-RCNN
  13. wap绿色传奇搭建(纯净版)
  14. 12万字 | 2021数据安全与个人信息保护技术白皮书(附下载)
  15. 像素三国志在线html5小游戏,像素三国志
  16. 消息队列及常见消息中间件
  17. js分享到微信朋友圈、QQ空间、QQ好友、新浪微博、腾讯微博、豆瓣、人人......
  18. Navicat for Mysql注册(Navicat 8.2 MySQL 8.2.17注册码)写入注册码后,点不动确认键
  19. QTableWidget, QTableView实现粘贴复制
  20. oracle审计查询sql语句,Oracle 数据库审计

热门文章

  1. 开集识别(open-set)算法(1)
  2. 【SpringCloud01EurekaRibbonNacos注册中心】
  3. 什么是Rosetta?
  4. 如何理解ROC曲线和AUC值
  5. Codecraft-20 (Div.2)
  6. Feign 原理解析
  7. 2022-2027年中国可穿戴医疗设备行业市场深度分析及投资战略规划报告
  8. SpringBoot: Web开发之Listener实践
  9. 分布式- BFT拜占庭容错
  10. vs + opencv + YOLO-Fastest 目标检测