SendMessage

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;

namespace Manager.Common
{
    public enum EngineResult
    {
        Success,
        FaildAndSuspend,
        FaildWithoutSuspend
    }

    //消息传递引擎
    public class RelayEngine<T>
    {
        private Thread _RelayThread;
        private AutoResetEvent _ItemArriveEvent = new AutoResetEvent(false);
        private ManualResetEvent _ResumeEvent = new ManualResetEvent(true);
        private WaitHandle[] _WaitHandles;
        private bool _Stop = false;

        private LinkedList<T> _Buffer = new LinkedList<T>();
        private Func<T, bool> _RelayFunc;
        private Func<T, EngineResult> _RelayFunc2;
        private Action<Exception> _HandleException;
        public bool IsSuspend = true;

        public RelayEngine(Func<T, bool> relayFunc, Action<Exception> handleException, Func<T, EngineResult> relayFunc2 = null)
        {
            this._WaitHandles = new WaitHandle[] { this._ItemArriveEvent, this._ResumeEvent };
            this._RelayFunc = relayFunc;
            this._RelayFunc2 = relayFunc2;
            this._HandleException = handleException;
            this._RelayThread = new Thread(this.Run) { IsBackground = true };
            this._RelayThread.Start();
            this.IsSuspend = false;
        }

        public void AddItem(T item)
        {
            lock (this)
            {
                this._Buffer.AddLast(item);
            }
            this._ItemArriveEvent.Set();
        }

        public void Suspend()
        {
            this.IsSuspend = true;
            this._ResumeEvent.Reset();
        }

        public void Resume()
        {
            this.IsSuspend = false;
            this._ResumeEvent.Set();
        }

        public void Stop()
        {
            this.IsSuspend = true; //线程挂起
            this._Stop = true;    //线程停止
            this._ItemArriveEvent.Set();
            this._ResumeEvent.Set();
        }

        private void Run()
        {
            try
            {
                while (true)
                {
                    if (this._Buffer.Count == 0)
                    {
                        WaitHandle.WaitAll(this._WaitHandles);
                    }
                    else
                    {
                        this._ResumeEvent.WaitOne(); //队列没有消息阻塞线程,知道收到信号
                    }

                    if (this._Stop) break;

                    if (this._Buffer.Count > 0)
                    {
                        T item = this._Buffer.First.Value; //先进先出
                        EngineResult result;
                        if (this._RelayFunc2 == null)
                        {
                            result = this._RelayFunc(item) ? EngineResult.Success : EngineResult.FaildAndSuspend;
                        }
                        else
                        {
                            result = this._RelayFunc2(item);
                        }
                        if (result == EngineResult.Success)
                        {
                            lock (this)
                            {
                                this._Buffer.RemoveFirst();
                            }
                        }
                        else
                        {
                            if (result == EngineResult.FaildAndSuspend) this.Suspend();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                this._HandleException(ex);
            }
        }
    }
}

时间: 2024-10-28 23:03:46

SendMessage的相关文章

c# sendmessage control to scroll

Declare some constants: private const int WM_SCROLL = 276; // Horizontal scroll private const int WM_VSCROLL = 277; // Vertical scroll private const int SB_LINEUP = 0; // Scrolls one line up private const int SB_LINELEFT = 0;// Scrolls one cell left

如何正确使用SendMessage进行发送消息

1.SendMessage的基本结构: SendMessage( HWND hWnd, //消息传递的目标窗口或线程的句柄. UINT Msg, //消息类别(这里可以是一些系统消息,也可以是自己定义,下文具体介绍,) WPARAM wParam, //参数1 (WPARAM 其实是与UINT是同种类型的, LPARAM lParam); //参数2 其中一些参数的由来如下: //typedef unsigned int UINT; //typedef UINT WPARAM; //typede

SendMessage发送自定义消息及消息响应(VC版)

控件向父窗体发送自定义消息,父窗体定义处理此消息的函数  程序源代码(整个工程)下载:http://download.csdn.net/detail/qq2399431200/6274793 效果描述: 指定哪个类添加自定义消息:(当然这个类必须是CmdTarget的子类,不然不能处理消息) 添加消息 实现消息函数:(wParam和lParam程序员可以自行设计传什么值) SendMessage参数解析(SendMessageA是单字节类型函数,SendMessageW是双字节) 1:接受此消息

Qt:移动无边框窗体(使用Windows的SendMessage)

移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下 网上的代码仅仅实现了两个事件 [cpp] view plain copy void EditDialog::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { m_DragPosition = event->globalPos() - this->pos(); event->accept()

【转】在C#中使用SendMessage

SendMessage是一个在user32.dll中声明的API函数,在C#中导入如下: using System.Runtime.InteropServices; [DllImport("user32.dll", EntryPoint="SendMessageA")] public static extern int SendMessage (IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam); 本文描述其参数

用PostMessage或SendMessage发送结构体指针

SendMessage可以随意发送结构体指针. PostMessage则必须注意结构体的生命周期. 例如如下发送代码,使用PostMessage: struct _tag_aa { CString s1; char szBuffer[512]; int a; char* szText; }; _tag_aa *a=new _tag_aa; a->s1="ssssss11111111111111"; strcpy(a->szBuffer,"Bufferrrrrrrr

PostMessage和SendMessage的区别

1, PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数.而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数. 2, 如果在同一个线程内,PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环Dispatch到目标窗口.SendMessage发送消息时,系统直接调用目标窗口的消息处理程序,并将结果返回,SendMessage在同一线程中发送消息并不入线程消息队列. 3,Po

C#中使用SendMessage进行进程通信的实例

原文:C#中使用SendMessage进行进程通信的实例 1 新建解决方案SendMessageSecondExample 在解决方案下面新建两个项目:Sender和Receiver,两者的输出类型均为"Windows 应用程序".整个程序的结构如下图所示. 2 实现项目Sender Sender仅包含一个名为"消息发送者"的窗体,如下图所示. 编写窗体后端代码,如下所示. using System; using System.Diagnostics; using

【转】vc中使用SendMessage正确发送自定义消息的方法--不错

原文网址:http://zhoumf1214.blog.163.com/blog/static/5241940200910265532959/ 最近在用VC2008做开发,后来由于要用到消息的发送,而且需要自定义消息,在网上查找了很多例子,根据他们所说的,虽然大致都差不多,但是基本上没有一个能完全做出来的.要知道VC编程有一个小地方出错,都可能是个让你头晕脑胀的事情.经过我后来不但探索,经过改进之后,一点错误都没有,现在贴出来供大家参考. 1. 先来个基本知识介绍 SendMessage的基本结

【转】SendMessage及WPRAME、LPARAME

原文网址:http://www.cnblogs.com/renyuan/archive/2012/11/26/2789103.html SendMessage及WPRAME.LPARAME typedef unsigned int UINT typedef UINT WPARAM typedef LONG LPARAM typedef LONG LRESULT 到了Win32API中,原来的16位变量也被扩展为32位,因此此时wParam和lParam的大小完全相同.WPARAM常常代表一些控件