下面的代码是介绍如何在windows平台发消息到非UI线程. 
主要是'PeekMessage || GetMessage' 这两个API的应用. 当他们被调用的时候,如果当前线程还没有消息循环,就会创建一个.
利用这个特性比自己手动的去创建一个消息循环要方便得多. 
发消息主要是使用线程PostThreadMessage

  1. #include <iostream>
  2. #include <string>
  3. #include "cassert"
  4. #include "windows.h"
  5. #include "process.h"
  6. enum { MSG_TEST = WM_USER+100,MSG_EXIT };
  7. unsigned __stdcall fun(void *param)
  8. {
  9. MSG msg;
  10. while(true)
  11. {
  12. if(GetMessage(&msg,0,0,0)) //get msg from message queue
  13. {
  14. char * info = reinterpret_cast<char*>(msg.wParam);
  15. bool keep_in_loop = true;
  16. switch(msg.message)
  17. {
  18. case MSG_TEST:
  19. std::cout << info << std::endl;
  20. break;
  21. case MSG_EXIT:keep_in_loop=false;
  22. std::cout << info << std::endl;
  23. break;
  24. default: break;
  25. }
  26. if ( ! keep_in_loop )
  27. {
  28. break;
  29. }
  30. }
  31. }
  32. std::cout << "out of loop" << std::endl;
  33. return 0;
  34. }
  35. void main()
  36. {
  37. HANDLE hThread;
  38. unsigned nThreadID;
  39. //start thread
  40. hThread = (HANDLE)_beginthreadex( NULL, 0, &fun, NULL, 0, &nThreadID );
  41. while(true)
  42. {
  43. UINT Msg = MSG_TEST;
  44. const char * p = "MSG_TEST";
  45. std::string commond;
  46. std::cin >> commond;
  47. if ( commond == "exit" )
  48. {
  49. Msg = MSG_EXIT;
  50. }
  51. BOOL bPostOK = PostThreadMessage(nThreadID,Msg,(WPARAM)p,0);
  52. if ( ! bPostOK )
  53. {
  54. assert( false );
  55. // the post event is to too early, please build msg loop first
  56. // 'PeekMessage || GetMessage' will forced to build the msg loop, if it does not exist.
  57. }
  58. }
  59. }

windows平台发消息到非UI线程.的更多相关文章

  1. Android线程---UI线程和非UI线程之间通信

        近期自学到了线程这一块,用了一上午的时间终于搞出来了主.子线程间的相互通信.当主线程sendMessage后,子线程便会调用handleMessage来获取你所发送的Message.我的主线程 ...

  2. Android UI线程和非UI线程

    Android UI线程和非UI线程 UI线程及Android的单线程模型原则 当应用启动,系统会创建一个主线程(main thread). 这个主线程负责向UI组件分发事件(包括绘制事件),也是在这 ...

  3. 学习通过Thread+Handler实现非UI线程更新UI组件

    [Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...

  4. 为什么在非UI线程中操作UI的改变失不安全的

    因为你如果允许在非UI线程更新操作UI的东西,那我再另一个非UI线程也可以更新这个Ui的东西 这样就会有冲突,比如你的线程刚好跑到修改UI这里,我的另一个UI也有可能跑到这里,所以这样导致线程不安全. ...

  5. Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面

    Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍 ...

  6. Android 高级UI设计笔记17:Android在非UI线程中显示Toast

    1. 子线程的Toast怎么显示不出来? 因为Toast在创建的时候会依赖于一个Handler,并且一个Handler是需要有一个Looper才能够创建,而普通的线程是不会自动去创建一个Looper对 ...

  7. 学习通过Thread+Handler实现非UI线程更新UI组件(转)

    [Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...

  8. android脚步---如何看log之程序停止运行,和UI线程和非UI线程之间切换

    经常运行eclipse时,烧到手机出现,“停止运行”,这时候得通过logcat查log了.一般这种情况属于FATAL EXCEPTION,所以检索FATAL 或者 EXCEPTION,然后往下看几行 ...

  9. Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面

    目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...

随机推荐

  1. C语言中头文件<stdio.h>中的#ifndef _STDIO_H_

    先了解这里的相关知识:http://www.cnblogs.com/stemon/p/4000468.html 头文件的中的#ifndef,这是一个很关键的东西.比如你有两个C文件,这两个C文件都in ...

  2. leetcode Letter Combinations of a Phone Number python

    class Solution(object): def letterCombinations(self, digits): """ :type digits: str : ...

  3. iOS对项目中第三方类库的管理——CocoaPods

    http://blog.csdn.net/lengshengren/article/details/1767 唐巧的博客:http://www.devtang.com/blog/2014/05/25/ ...

  4. Android StrictMode介绍

    转:http://www.blueowls.net/android-strictmode%E4%BB%8B%E7%BB%8D/ /** * enables "strict mode" ...

  5. SQL Server 查看对象的权限

    例子 1. 查看登录名 loginA的权限: create login loginA with password = '123456'; go use studio; create user logi ...

  6. Solr学习(2) Solr4.2.0+IK Analyzer 2012

    Solr学习(二) Solr4.2.0+IK Analyzer 2012 开场白: 本章简单讲述如何在solr中配置著名的 IK Analyzer 分词器. 本章建立在 Solr学习(一)  基础上进 ...

  7. discuz函数quote

    public static function quote($str, $noarray = false) { if (is_string($str)) return '\'' . addcslashe ...

  8. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(五)

    目的: 1. 了解PCI的基本知识,为完成watchdog的设备做准备. 准备知识: 简单的说,PCI 设备分3个空间. 配置空间,IO空间,内存地址空间. PCI设备厂家决定了外设是使用IO空间还是 ...

  9. openNebula dubug

    lowest common denominator convenient way to manage virtual machines

  10. jQuery easyUI Pagination控件自定义div分页(不用datagrid)

    一般后台管理页面分页是通过datagrid加Pagination分页,但是如果前台页面没有用表格,例如博客的文章列表从上到下一般是到div分页, 这时如果还要用Pagination,则可以这样: 页面 ...