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 ...
随机推荐
- leetcode Binary Tree Right Side View python
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = ...
- Linux网络管理——端口作用
1. 网络基础 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB",&q ...
- vvv
すぎやま(杉山) ハイコンテンツコンテスト assortedアクセント・音節as・sórt・ed 発音記号/‐ṭɪd/音声を聞く [形容詞]1分類した,仕分けした.2〈ビスケットなど〉詰め合わせの.用 ...
- php中禁止非法调用和硬路径引入文件的方法
php中禁止非法调用和硬路径引入文件的方法 在php中有一些公共的文件为了方便,我们会做一个公共文件,让不用的文件共同调用.为了禁止公共文件被非常单独调用,可以在文件上做一个常量,禁止非常调用:在公共 ...
- cocos2d-x -------之笔记篇 动画的实现
cocos2d-x 动画的实现 一.实现原理 动画的实现其实就是使用一个完整的动作图片集来实现动画,达到动态的效果 动画动作类(CCAnimate)是加载一个动画类来实现动作. 动画类(CCAnima ...
- MongoDB 从0开始
MongoDB https://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/ 在Mac上安装 brew update brew i ...
- Python核心编程笔记---- input 与raw_input
1.raw_input:的返回值是一个string 对象. 2.input:相当于eval(raw_input()),计算出来是什么类型就是什么类型. ------------------------ ...
- [原]容器学习(二):动手模拟AOP
简单来说,Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架.上文已经介绍模拟IoC实现,这篇文章来动手模拟AOP. AOP简述 面向对象强调"一切皆是对象" ...
- csu 1563 Lexicography
题意:给出一堆字母 问这些字母组成的字符串中第k大的 排列组合,具体看代码 //寒假集训被何柱大大踩好惨(>_<) #include<cstdio> #include<i ...
- SMTP协议分析
SMTP协议分析 第1章. SMTP概述 1.1. SMTP在邮件通信中的位置 SMTP,即简单邮件传送协议,所相应RFC文档为RFC821.同http等多数应用层协议一样,它工作在C/S模 ...