C# 向指定线程发送消息

来源:互联网 发布:flash cs3 mac 中文 编辑:程序博客网 时间:2024/05/28 11:49

线程间通信,包括线程同步,在指定线程中执行方法。

线程同步

其中线程同步通过C#本身提供的线程操作还是比较简单的,注意使用互斥锁,WaitHandle的使用可以满足大部分的需求。(互斥锁在不同线程中起作用,不会堵塞同线程的程序运行)。


在指定线程中执行方法

这种情况比较少见,一般都是窗体程序需要后台进行运算,通过运算的结果对前台界面进行更新。大多数情况下使用BackgroundWorker类和Task类可以满足需求。但在极端的情况下可能还是需要自己去实现不同线程的方法执行。

C#本身的线程操作中不能直接做到在一个线程中让另一个特定的线程运行方法,要完成这样的操作,需要用到Windows的消息机制。使用下面的函数可以向指定ID的线程发送消息:

BOOL WINAPI PostThreadMessage(  _In_ DWORD  idThread,  _In_ UINT   Msg,  _In_ WPARAM wParam,  _In_ LPARAM lParam);
在C#中可以用下面的方式引用方法

[DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)][return: MarshalAs(UnmanagedType.Bool)]public static extern bool PostThreadMessage(int idThread, int Msg, IntPtr wParam, IntPtr lParam);

如果要向一个窗体的线程发送自定义消息,使用PostThreadMessage函数时会发现窗体无法接收到自己定义的消息。这是因为窗体进程的标准消息循环只获取对窗体发送的消息而PostThreadMessage只是指定了接收消息的线程ID,所以通过PostThreadMessage被过滤掉了。

如果接收消息的是有窗体的线程,可以用SendMessage函数向指定的窗体发送消息。

在必须指定线程ID的情况下,只能通过Hook来完成相关操作。

我选择的是WH_GETMESSAGE类型的HOOK,回掉函数为:

LRESULT CALLBACK GetMsgProc(  _In_ int    code,  _In_ WPARAM wParam,  _In_ LPARAM lParam);

其中 code 参数并不是消息的消息值。真正的消息值要通过lParam来获得,lParam指向一个MSG结构。

同时一个相同的消息一般会被接收到2次,一次在消息还在消息队列中时接收一次,另一次是消息从消息队列中被移除。

通过wParam的值可以知道当前捕获的消息是否在队列中。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果7p反复重启怎么办 苹果手机屏幕触屏不灵怎么办 苹果手机屏翘起来了怎么办 苹果x手机触屏失灵怎么办 苹果7手机变成黑白屏怎么办 苹果手机屏不动了怎么办 苹果6老是卡屏怎么办 苹果x卡屏死机怎么办 苹果6死机卡屏怎么办 苹果手机主屏死机怎么办 苹果7手机卡屏死机怎么办 苹果6s卡死了怎么办 6s手机显示丢失锁定怎么办 酷比s9被root怎么办 垃圾清理把相片删除了怎么办 小米电脑怎么下载软件怎么办 华为手机pin码忘了怎么办 锁屏密码忘了怎么办 抖音停止运行了怎么办? 华为手机右下角有个小人怎么办 华为手机程序停止运行怎么办 华为手机不支持软件搬家怎么办 红米手机没有任务键怎么办 进网许可丢了怎么办 华为稳私空间被稳蔵怎么办 华为手机安装不了软件怎么办 华为手机自动安装软件怎么办 手机在实体店买贵了怎么办 日本买的kindle坏了怎么办 华为麦芒4屏幕失灵怎么办 华为麦芒6屏幕失灵怎么办 手机为什么总显示内存不足怎么办 小米云服务满了怎么办 魅蓝s6声音小怎么办 华为畅享7s丢失怎么办 华为耳机孔坏了怎么办 苹果手机耳机插孔坏了怎么办 荣耀8听筒声音小怎么办 荣耀8听筒音量小怎么办 华为荣耀6声音小怎么办 华为荣耀v8通话声音小怎么办