pascalabcnet/VisualPascalABCNETLinux/DS/RunManager/EventedEventWaitHandleList.cs
Mikhalkovich Stanislav 3072383106 Для Linux-версии исправлен DockContent, редактор (показ всплывающего окна)
Сделан новый проект VisualPABCLinux
И пришлось склонировать PluginsSupport, поскольку он вносит зависимость по редактору
Компоненты WeifenLuo для Linux надо после перекомпиляции скопировать в Libraries - подшить их к основному проекту просто не получилось
2022-06-30 09:47:11 +03:00

63 lines
1.9 KiB
C#

// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace VisualPascalABC
{
public class EventedEventWaitHandleList
{
public delegate void SignalDelegate(string id);
SignalDelegate Signal;
Dictionary<string, ThreadObject> Threads = new Dictionary<string, ThreadObject>();
class ThreadObject
{
public string id;
public SignalDelegate Signal;
public EventWaitHandle EventWaitHandle;
public Thread thread;
}
void ThreadExecute(object obj)
{
ThreadObject to = (ThreadObject)obj;
while (to.EventWaitHandle != null)
{
to.EventWaitHandle.WaitOne();
if (to.EventWaitHandle != null)
Signal(to.id);
}
}
public EventedEventWaitHandleList(SignalDelegate Signal)
{
this.Signal = Signal;
}
public void Add(string id)
{
ThreadObject to = new ThreadObject();
to.thread = new Thread(new ParameterizedThreadStart(ThreadExecute));
to.id = id;
to.Signal = Signal;
to.EventWaitHandle = new EventWaitHandle(false, System.Threading.EventResetMode.AutoReset, id);
to.thread.Start(to);
Threads.Add(id, to);
}
public void Remove(string id)
{
ThreadObject to = Threads[id];
EventWaitHandle e = to.EventWaitHandle;
to.EventWaitHandle = null;
e.Set();
e.Close();
to.thread.Join();
Threads.Remove(id);
}
}
}