准备更新BP
This commit is contained in:
803
Convention/[Runtime]/Convention.TaskPool.cs
Normal file
803
Convention/[Runtime]/Convention.TaskPool.cs
Normal file
@@ -0,0 +1,803 @@
|
||||
using Convention.Collections;
|
||||
using Convention.Collections.Generic;
|
||||
using Convention.ReferenceManagement;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace Convention.TaskManagement
|
||||
{
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
public abstract class TaskBase: IReference
|
||||
{
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>
|
||||
/// </summary>
|
||||
public const int DefaultPriority = 0;
|
||||
|
||||
private int m_SerialId;
|
||||
private string m_Tag;
|
||||
private int m_Priority;
|
||||
private object m_UserData;
|
||||
|
||||
private bool m_Done;
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
|
||||
/// </summary>
|
||||
public TaskBase()
|
||||
{
|
||||
m_SerialId = 0;
|
||||
m_Tag = null;
|
||||
m_Priority = DefaultPriority;
|
||||
m_Done = false;
|
||||
m_UserData = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
|
||||
/// </summary>
|
||||
public int SerialId
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_SerialId;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>ǩ
|
||||
/// </summary>
|
||||
public string Tag
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Tag;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
|
||||
/// </summary>
|
||||
public int Priority
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Priority;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
public object UserData
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_UserData;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
public bool Done
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Done;
|
||||
}
|
||||
set
|
||||
{
|
||||
m_Done = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
public virtual string Description
|
||||
{
|
||||
get
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
/// <param name="serialId"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD></param>
|
||||
/// <param name="tag"><3E><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>ǩ</param>
|
||||
/// <param name="priority"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD></param>
|
||||
/// <param name="userData"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
||||
internal void Initialize(int serialId, string tag, int priority, object userData)
|
||||
{
|
||||
m_SerialId = serialId;
|
||||
m_Tag = tag;
|
||||
m_Priority = priority;
|
||||
m_UserData = userData;
|
||||
m_Done = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
public virtual void Clear()
|
||||
{
|
||||
m_SerialId = 0;
|
||||
m_Tag = null;
|
||||
m_Priority = DefaultPriority;
|
||||
m_UserData = null;
|
||||
m_Done = false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
||||
/// </summary>
|
||||
public enum StartTaskStatus : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̴<EFBFBD><CCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɴ<EFBFBD><C9B4><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
Done = 0,
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
CanResume,
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
HasToWait,
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F1A3ACB3><EFBFBD>δ֪<CEB4><D6AA><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
UnknownError
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
|
||||
/// </summary>
|
||||
/// <typeparam name="T"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></typeparam>
|
||||
public interface ITaskAgent<T> where T : TaskBase
|
||||
{
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
T Task
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
void Initialize();
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ
|
||||
/// </summary>
|
||||
/// <param name="elapseSeconds"><3E><EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>λ</param>
|
||||
/// <param name="realElapseSeconds"><3E><>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>λ</param>
|
||||
void Update(float elapseSeconds, float realElapseSeconds);
|
||||
|
||||
/// <summary>
|
||||
/// <20>رղ<D8B1><D5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
void Shutdown();
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
/// <param name="task">Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
||||
/// <returns><3E><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬</returns>
|
||||
StartTaskStatus Start(T task);
|
||||
|
||||
/// <summary>
|
||||
/// ֹͣ<CDA3><D6B9><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
void Reset();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD>״̬
|
||||
/// </summary>
|
||||
public enum TaskStatus : byte
|
||||
{
|
||||
/// <summary>
|
||||
/// δ<><CEB4>ʼ
|
||||
/// </summary>
|
||||
Todo = 0,
|
||||
|
||||
/// <summary>
|
||||
/// ִ<><D6B4><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
Doing,
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
Done
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
/// </summary>
|
||||
[StructLayout(LayoutKind.Auto)]
|
||||
public readonly struct TaskInfo
|
||||
{
|
||||
private readonly bool m_IsValid;
|
||||
private readonly int m_SerialId;
|
||||
private readonly string m_Tag;
|
||||
private readonly int m_Priority;
|
||||
private readonly object m_UserData;
|
||||
private readonly TaskStatus m_Status;
|
||||
private readonly string m_Description;
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
/// <param name="serialId"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD></param>
|
||||
/// <param name="tag"><3E><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>ǩ</param>
|
||||
/// <param name="priority"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD></param>
|
||||
/// <param name="userData"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
||||
/// <param name="status"><3E><><EFBFBD><EFBFBD>״̬</param>
|
||||
/// <param name="description"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
||||
public TaskInfo(int serialId, string tag, int priority, object userData, TaskStatus status, string description)
|
||||
{
|
||||
m_IsValid = true;
|
||||
m_SerialId = serialId;
|
||||
m_Tag = tag;
|
||||
m_Priority = priority;
|
||||
m_UserData = userData;
|
||||
m_Status = status;
|
||||
m_Description = description;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
||||
/// </summary>
|
||||
public bool IsValid
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_IsValid;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
|
||||
/// </summary>
|
||||
public int SerialId
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!m_IsValid)
|
||||
{
|
||||
throw new InvalidOperationException("Data is invalid.");
|
||||
}
|
||||
|
||||
return m_SerialId;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>ǩ
|
||||
/// </summary>
|
||||
public string Tag
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!m_IsValid)
|
||||
{
|
||||
throw new InvalidOperationException("Data is invalid.");
|
||||
}
|
||||
|
||||
return m_Tag;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>
|
||||
/// </summary>
|
||||
public int Priority
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!m_IsValid)
|
||||
{
|
||||
throw new InvalidOperationException("Data is invalid.");
|
||||
}
|
||||
|
||||
return m_Priority;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
public object UserData
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!m_IsValid)
|
||||
{
|
||||
throw new InvalidOperationException("Data is invalid.");
|
||||
}
|
||||
|
||||
return m_UserData;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬
|
||||
/// </summary>
|
||||
public TaskStatus Status
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!m_IsValid)
|
||||
{
|
||||
throw new InvalidOperationException("Data is invalid.");
|
||||
}
|
||||
|
||||
return m_Status;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
public string Description
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!m_IsValid)
|
||||
{
|
||||
throw new InvalidOperationException("Data is invalid.");
|
||||
}
|
||||
|
||||
return m_Description;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
/// <typeparam name="T"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></typeparam>
|
||||
public class TaskPool<T> where T : TaskBase
|
||||
{
|
||||
private readonly Stack<ITaskAgent<T>> m_FreeAgents;
|
||||
private readonly LinkedCacheList<ITaskAgent<T>> m_WorkingAgents;
|
||||
private readonly LinkedCacheList<T> m_WaitingTasks;
|
||||
private bool m_Paused;
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
public TaskPool()
|
||||
{
|
||||
m_FreeAgents = new Stack<ITaskAgent<T>>();
|
||||
m_WorkingAgents = new LinkedCacheList<ITaskAgent<T>>();
|
||||
m_WaitingTasks = new LinkedCacheList<T>();
|
||||
m_Paused = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3>
|
||||
/// </summary>
|
||||
public bool Paused
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_Paused;
|
||||
}
|
||||
set
|
||||
{
|
||||
m_Paused = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
public int TotalAgentCount
|
||||
{
|
||||
get
|
||||
{
|
||||
return FreeAgentCount + WorkingAgentCount;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
public int FreeAgentCount
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_FreeAgents.Count;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
public int WorkingAgentCount
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_WorkingAgents.Count;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
public int WaitingTaskCount
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_WaitingTasks.Count;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF>
|
||||
/// </summary>
|
||||
/// <param name="elapseSeconds"><3E><EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>λ<EFBFBD><CEBB></param>
|
||||
/// <param name="realElapseSeconds"><3E><>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>λ<EFBFBD><CEBB></param>
|
||||
public void Update(float elapseSeconds, float realElapseSeconds)
|
||||
{
|
||||
if (m_Paused)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ProcessRunningTasks(elapseSeconds, realElapseSeconds);
|
||||
ProcessWaitingTasks(elapseSeconds, realElapseSeconds);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20>رղ<D8B1><D5B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ء<EFBFBD>
|
||||
/// </summary>
|
||||
public void Shutdown()
|
||||
{
|
||||
RemoveAllTasks();
|
||||
|
||||
while (FreeAgentCount > 0)
|
||||
{
|
||||
m_FreeAgents.Pop().Shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
/// <param name="agent">Ҫ<><D2AA><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
||||
public void AddAgent(ITaskAgent<T> agent)
|
||||
{
|
||||
if (agent == null)
|
||||
{
|
||||
throw new InvalidOperationException("Task agent is invalid.");
|
||||
}
|
||||
|
||||
agent.Initialize();
|
||||
m_FreeAgents.Push(agent);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1>Ż<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
|
||||
/// </summary>
|
||||
/// <param name="serialId">Ҫ<><D2AA>ȡ<EFBFBD><C8A1>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1>š<EFBFBD></param>
|
||||
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2></returns>
|
||||
public TaskInfo GetTaskInfo(int serialId)
|
||||
{
|
||||
foreach (ITaskAgent<T> workingAgent in m_WorkingAgents)
|
||||
{
|
||||
T workingTask = workingAgent.Task;
|
||||
if (workingTask.SerialId == serialId)
|
||||
{
|
||||
return new TaskInfo(workingTask.SerialId, workingTask.Tag, workingTask.Priority, workingTask.UserData, workingTask.Done ? TaskStatus.Done : TaskStatus.Doing, workingTask.Description);
|
||||
}
|
||||
}
|
||||
|
||||
foreach (T waitingTask in m_WaitingTasks)
|
||||
{
|
||||
if (waitingTask.SerialId == serialId)
|
||||
{
|
||||
return new TaskInfo(waitingTask.SerialId, waitingTask.Tag, waitingTask.Priority, waitingTask.UserData, TaskStatus.Todo, waitingTask.Description);
|
||||
}
|
||||
}
|
||||
|
||||
return default(TaskInfo);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>ǩ<EFBFBD><C7A9>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
|
||||
/// </summary>
|
||||
/// <param name="tag">Ҫ<><D2AA>ȡ<EFBFBD><C8A1>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>ǩ<EFBFBD><C7A9></param>
|
||||
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2></returns>
|
||||
public TaskInfo[] GetTaskInfos(string tag)
|
||||
{
|
||||
List<TaskInfo> results = new List<TaskInfo>();
|
||||
GetTaskInfos(tag, results);
|
||||
return results.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>ǩ<EFBFBD><C7A9>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
|
||||
/// </summary>
|
||||
/// <param name="tag">Ҫ<><D2AA>ȡ<EFBFBD><C8A1>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>ǩ<EFBFBD><C7A9></param>
|
||||
/// <param name="results"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2></param>
|
||||
public void GetTaskInfos(string tag, List<TaskInfo> results)
|
||||
{
|
||||
if (results == null)
|
||||
{
|
||||
throw new InvalidOperationException("Results is invalid.");
|
||||
}
|
||||
|
||||
results.Clear();
|
||||
foreach (ITaskAgent<T> workingAgent in m_WorkingAgents)
|
||||
{
|
||||
T workingTask = workingAgent.Task;
|
||||
if (workingTask.Tag == tag)
|
||||
{
|
||||
results.Add(new TaskInfo(workingTask.SerialId, workingTask.Tag, workingTask.Priority, workingTask.UserData, workingTask.Done ? TaskStatus.Done : TaskStatus.Doing, workingTask.Description));
|
||||
}
|
||||
}
|
||||
|
||||
foreach (T waitingTask in m_WaitingTasks)
|
||||
{
|
||||
if (waitingTask.Tag == tag)
|
||||
{
|
||||
results.Add(new TaskInfo(waitingTask.SerialId, waitingTask.Tag, waitingTask.Priority, waitingTask.UserData, TaskStatus.Todo, waitingTask.Description));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
|
||||
/// </summary>
|
||||
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2></returns>
|
||||
public TaskInfo[] GetAllTaskInfos()
|
||||
{
|
||||
int index = 0;
|
||||
TaskInfo[] results = new TaskInfo[m_WorkingAgents.Count + m_WaitingTasks.Count];
|
||||
foreach (ITaskAgent<T> workingAgent in m_WorkingAgents)
|
||||
{
|
||||
T workingTask = workingAgent.Task;
|
||||
results[index++] = new TaskInfo(workingTask.SerialId, workingTask.Tag, workingTask.Priority, workingTask.UserData, workingTask.Done ? TaskStatus.Done : TaskStatus.Doing, workingTask.Description);
|
||||
}
|
||||
|
||||
foreach (T waitingTask in m_WaitingTasks)
|
||||
{
|
||||
results[index++] = new TaskInfo(waitingTask.SerialId, waitingTask.Tag, waitingTask.Priority, waitingTask.UserData, TaskStatus.Todo, waitingTask.Description);
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>
|
||||
/// </summary>
|
||||
/// <param name="results"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2></param>
|
||||
public void GetAllTaskInfos(List<TaskInfo> results)
|
||||
{
|
||||
if (results == null)
|
||||
{
|
||||
throw new InvalidOperationException("Results is invalid.");
|
||||
}
|
||||
|
||||
results.Clear();
|
||||
foreach (ITaskAgent<T> workingAgent in m_WorkingAgents)
|
||||
{
|
||||
T workingTask = workingAgent.Task;
|
||||
results.Add(new TaskInfo(workingTask.SerialId, workingTask.Tag, workingTask.Priority, workingTask.UserData, workingTask.Done ? TaskStatus.Done : TaskStatus.Doing, workingTask.Description));
|
||||
}
|
||||
|
||||
foreach (T waitingTask in m_WaitingTasks)
|
||||
{
|
||||
results.Add(new TaskInfo(waitingTask.SerialId, waitingTask.Tag, waitingTask.Priority, waitingTask.UserData, TaskStatus.Todo, waitingTask.Description));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
/// <param name="task">Ҫ<><D2AA><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
||||
public void AddTask(T task)
|
||||
{
|
||||
LinkedListNode<T> current = m_WaitingTasks.Last;
|
||||
while (current != null)
|
||||
{
|
||||
if (task.Priority <= current.Value.Priority)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
current = current.Previous;
|
||||
}
|
||||
|
||||
if (current != null)
|
||||
{
|
||||
m_WaitingTasks.AddAfter(current, task);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_WaitingTasks.AddFirst(task);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
/// <param name="serialId">Ҫ<>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1>š<EFBFBD></param>
|
||||
/// <returns><3E>Ƿ<EFBFBD><C7B7>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD></returns>
|
||||
public bool RemoveTask(int serialId)
|
||||
{
|
||||
foreach (T task in m_WaitingTasks)
|
||||
{
|
||||
if (task.SerialId == serialId)
|
||||
{
|
||||
m_WaitingTasks.Remove(task);
|
||||
ReferencePool.Release(task);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
LinkedListNode<ITaskAgent<T>> currentWorkingAgent = m_WorkingAgents.First;
|
||||
while (currentWorkingAgent != null)
|
||||
{
|
||||
LinkedListNode<ITaskAgent<T>> next = currentWorkingAgent.Next;
|
||||
ITaskAgent<T> workingAgent = currentWorkingAgent.Value;
|
||||
T task = workingAgent.Task;
|
||||
if (task.SerialId == serialId)
|
||||
{
|
||||
workingAgent.Reset();
|
||||
m_FreeAgents.Push(workingAgent);
|
||||
m_WorkingAgents.Remove(currentWorkingAgent);
|
||||
ReferencePool.Release(task);
|
||||
return true;
|
||||
}
|
||||
|
||||
currentWorkingAgent = next;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>ǩ<EFBFBD>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
/// <param name="tag">Ҫ<>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>ǩ<EFBFBD><C7A9></param>
|
||||
/// <returns><3E>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
|
||||
public int RemoveTasks(string tag)
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
LinkedListNode<T> currentWaitingTask = m_WaitingTasks.First;
|
||||
while (currentWaitingTask != null)
|
||||
{
|
||||
LinkedListNode<T> next = currentWaitingTask.Next;
|
||||
T task = currentWaitingTask.Value;
|
||||
if (task.Tag == tag)
|
||||
{
|
||||
m_WaitingTasks.Remove(currentWaitingTask);
|
||||
ReferencePool.Release(task);
|
||||
count++;
|
||||
}
|
||||
|
||||
currentWaitingTask = next;
|
||||
}
|
||||
|
||||
LinkedListNode<ITaskAgent<T>> currentWorkingAgent = m_WorkingAgents.First;
|
||||
while (currentWorkingAgent != null)
|
||||
{
|
||||
LinkedListNode<ITaskAgent<T>> next = currentWorkingAgent.Next;
|
||||
ITaskAgent<T> workingAgent = currentWorkingAgent.Value;
|
||||
T task = workingAgent.Task;
|
||||
if (task.Tag == tag)
|
||||
{
|
||||
workingAgent.Reset();
|
||||
m_FreeAgents.Push(workingAgent);
|
||||
m_WorkingAgents.Remove(currentWorkingAgent);
|
||||
ReferencePool.Release(task);
|
||||
count++;
|
||||
}
|
||||
|
||||
currentWorkingAgent = next;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
/// </summary>
|
||||
/// <returns><3E>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
|
||||
public int RemoveAllTasks()
|
||||
{
|
||||
int count = m_WaitingTasks.Count + m_WorkingAgents.Count;
|
||||
|
||||
foreach (T task in m_WaitingTasks)
|
||||
{
|
||||
ReferencePool.Release(task);
|
||||
}
|
||||
|
||||
m_WaitingTasks.Clear();
|
||||
|
||||
foreach (ITaskAgent<T> workingAgent in m_WorkingAgents)
|
||||
{
|
||||
T task = workingAgent.Task;
|
||||
workingAgent.Reset();
|
||||
m_FreeAgents.Push(workingAgent);
|
||||
ReferencePool.Release(task);
|
||||
}
|
||||
|
||||
m_WorkingAgents.Clear();
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
private void ProcessRunningTasks(float elapseSeconds, float realElapseSeconds)
|
||||
{
|
||||
LinkedListNode<ITaskAgent<T>> current = m_WorkingAgents.First;
|
||||
while (current != null)
|
||||
{
|
||||
T task = current.Value.Task;
|
||||
if (!task.Done)
|
||||
{
|
||||
current.Value.Update(elapseSeconds, realElapseSeconds);
|
||||
current = current.Next;
|
||||
continue;
|
||||
}
|
||||
|
||||
LinkedListNode<ITaskAgent<T>> next = current.Next;
|
||||
current.Value.Reset();
|
||||
m_FreeAgents.Push(current.Value);
|
||||
m_WorkingAgents.Remove(current);
|
||||
ReferencePool.Release(task);
|
||||
current = next;
|
||||
}
|
||||
}
|
||||
|
||||
private void ProcessWaitingTasks(float elapseSeconds, float realElapseSeconds)
|
||||
{
|
||||
LinkedListNode<T> current = m_WaitingTasks.First;
|
||||
while (current != null && FreeAgentCount > 0)
|
||||
{
|
||||
ITaskAgent<T> agent = m_FreeAgents.Pop();
|
||||
LinkedListNode<ITaskAgent<T>> agentNode = m_WorkingAgents.AddLast(agent);
|
||||
T task = current.Value;
|
||||
LinkedListNode<T> next = current.Next;
|
||||
StartTaskStatus status = agent.Start(task);
|
||||
if (status == StartTaskStatus.Done || status == StartTaskStatus.HasToWait || status == StartTaskStatus.UnknownError)
|
||||
{
|
||||
agent.Reset();
|
||||
m_FreeAgents.Push(agent);
|
||||
m_WorkingAgents.Remove(agentNode);
|
||||
}
|
||||
|
||||
if (status == StartTaskStatus.Done || status == StartTaskStatus.CanResume || status == StartTaskStatus.UnknownError)
|
||||
{
|
||||
m_WaitingTasks.Remove(current);
|
||||
}
|
||||
|
||||
if (status == StartTaskStatus.Done || status == StartTaskStatus.UnknownError)
|
||||
{
|
||||
ReferencePool.Release(task);
|
||||
}
|
||||
|
||||
current = next;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user