windows平台发消息到非UI线程.
下面的代码是介绍如何在windows平台发消息到非UI线程.
主要是'PeekMessage || GetMessage' 这两个API的应用. 当他们被调用的时候,如果当前线程还没有消息循环,就会创建一个.
利用这个特性比自己手动的去创建一个消息循环要方便得多.
发消息主要是使用线程PostThreadMessage
- #include <iostream>
- #include <string>
- #include "cassert"
- #include "windows.h"
- #include "process.h"
- enum { MSG_TEST = WM_USER+100,MSG_EXIT };
- unsigned __stdcall fun(void *param)
- {
- MSG msg;
- while(true)
- {
- if(GetMessage(&msg,0,0,0)) //get msg from message queue
- {
- char * info = reinterpret_cast<char*>(msg.wParam);
- bool keep_in_loop = true;
- switch(msg.message)
- {
- case MSG_TEST:
- std::cout << info << std::endl;
- break;
- case MSG_EXIT:keep_in_loop=false;
- std::cout << info << std::endl;
- break;
- default: break;
- }
- if ( ! keep_in_loop )
- {
- break;
- }
- }
- }
- std::cout << "out of loop" << std::endl;
- return 0;
- }
- void main()
- {
- HANDLE hThread;
- unsigned nThreadID;
- //start thread
- hThread = (HANDLE)_beginthreadex( NULL, 0, &fun, NULL, 0, &nThreadID );
- while(true)
- {
- UINT Msg = MSG_TEST;
- const char * p = "MSG_TEST";
- std::string commond;
- std::cin >> commond;
- if ( commond == "exit" )
- {
- Msg = MSG_EXIT;
- }
- BOOL bPostOK = PostThreadMessage(nThreadID,Msg,(WPARAM)p,0);
- if ( ! bPostOK )
- {
- assert( false );
- // the post event is to too early, please build msg loop first
- // 'PeekMessage || GetMessage' will forced to build the msg loop, if it does not exist.
- }
- }
- }
windows平台发消息到非UI线程.的更多相关文章
- Android线程---UI线程和非UI线程之间通信
近期自学到了线程这一块,用了一上午的时间终于搞出来了主.子线程间的相互通信.当主线程sendMessage后,子线程便会调用handleMessage来获取你所发送的Message.我的主线程 ...
- Android UI线程和非UI线程
Android UI线程和非UI线程 UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这 ...
- 学习通过Thread+Handler实现非UI线程更新UI组件
[Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...
- 为什么在非UI线程中操作UI的改变失不安全的
因为你如果允许在非UI线程更新操作UI的东西,那我再另一个非UI线程也可以更新这个Ui的东西 这样就会有冲突,比如你的线程刚好跑到修改UI这里,我的另一个UI也有可能跑到这里,所以这样导致线程不安全. ...
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍 ...
- Android 高级UI设计笔记17:Android在非UI线程中显示Toast
1. 子线程的Toast怎么显示不出来? 因为Toast在创建的时候会依赖于一个Handler,并且一个Handler是需要有一个Looper才能够创建,而普通的线程是不会自动去创建一个Looper对 ...
- 学习通过Thread+Handler实现非UI线程更新UI组件(转)
[Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...
- android脚步---如何看log之程序停止运行,和UI线程和非UI线程之间切换
经常运行eclipse时,烧到手机出现,“停止运行”,这时候得通过logcat查log了.一般这种情况属于FATAL EXCEPTION,所以检索FATAL 或者 EXCEPTION,然后往下看几行 ...
- Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面
目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...
随机推荐
- 浅谈C中的指针和数组(五)
前面写了一些C指针和数组的一些知识,但是还有一些很重要的知识没有交代,这里做一个补充. 首先看一下,普通变量(指针也是变量)和数组名查看地址的方式是不同的. 查看数组变量的地址,不需要使用 & ...
- Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013)上
下载安装软件 下载 Opencv for Windows 最新版本,本文是 Opencv 2.4.8.双击后会出现解压提示,实际上就是“安装”了,路径填写为 D:/Program Files,然后确定 ...
- .Xmodmap vim键位映射。
remove Lock = Caps_Lockkeysym Caps_Lock = Control_Ladd Control = Control_Lkeysym Escape = grave asci ...
- 基于位运算符的IP和数值转换
直接上代码: $str = '192.168.2.100'; echo 'IP:',$str,'<hr />'; $int = ip_long($str); echo $int,'< ...
- substr(dirname(__FILE__))
这是discuz中定义论坛安装根目录的一个常量.现在我们就来分析一下这个很简单但是非常实用的常量. define('DISCUZ_ROOT', substr(dirname(__FILE__) ...
- codeforces 13E . Holes 分块
题目链接 nextt数组表示这个位置的下一个位置. cnt数组表示这个位置 i 到nextt[i]可以弹几次. end[i] 表示在从 i 弹出去的情况下, 最后一个位置是哪里. 然后就看代码吧. # ...
- ViewPager实现页卡的最新方法--简洁的TabLayout(谷歌支持包)
效果图: 添加依赖包: compile ‘com.android.support:design:‘ 布局文件: <?xml version="1.0" encoding=&q ...
- Referrer 还是 Referer?
上回我写了一篇文章介绍「Referrer Policy」,有小伙伴看完后问我:Referrer 这个单词到底怎么拼,为什么有时候中间有两个 r,有时候只有一个? 是的,这是一个很有趣的问题,这里就给有 ...
- 细说javascript函数
javascript函数是一个比较奇怪的东西,接触一段时间你就会犯迷糊,弄不明白它到底是什么了.你是否会因为有的javascript函数没有名字而莫名其妙,是否会因为javascript函数的参数没有 ...
- Android软件版本更新
转的:适合新手学习,但在实际项目中不可这么做. 以下是我转的内容: ================================================================= ...