windows平台发消息到非UI线程.

下面的代码是介绍如何在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. }
时间: 2025-01-30 10:54:45

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

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

  [Android线程机制]    出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则:只允许UI线程修改Activity里的UI组件    当一个程序第一次启动时,Android会同时启动一条主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户的按键事件,用户接触屏幕的事件及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理.所以主线程通常又被叫

在非UI线程处理Bitmap

http://my.oschina.net/ryanhoo/blog/88344 译者:Ryan Hoo 来源:https://developer.android.com/develop/index.html 译者按: 在Google最新的文档中,提供了一系列含金量相当高的教程.因为种种原因而鲜为人知,真是可惜!Ryan将会细心整理,将之翻译成中文,希望对开发者有所帮助.         本系列是Google关于展示大Bitmap(位图)的官方演示,可以有效的解决内存限制,更加有效的加载并显示图

请问怎么server端限制IM用户只能发消息给好友,不能发消息给非好友

问题描述 解决方案 环信不是好友也可以消息,只要知道对方id就可以. 调用rest接口发送,只要有id就行解决方案二:options.setUseRoster(true);把这个设置设为true就可以了,如果你们自己维护好友体系的话,发消息前判断下好友关系就可以了.

SWT 关闭窗口后 非UI线程如何关闭?

问题描述 刚刚开始学SWT,有个问题不知道如何解决public static void main(String[] args) {try {ClientLoginWindow window = new ClientLoginWindow();window.open();} catch (Exception e) {e.printStackTrace();}}public void open() {Display display = Display.getDefault();createConte

Android 关于操作UI线程

在非UI线程里访问 Android UI toolkit-这个在一个worker线程修改了 View .这会导致不可预期的结果,而且还难以调试.   为了修复这个问题,Android提供了几个方法从非UI线程访问Android UI toolkit .详见下面的这个列表: Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long)   可以使用 View.post(Runnable) 

细说UI线程和Windows消息队列(经典)

 在Windows应用程序中,窗体是由一种称为"UI线程(User Interface Thread)"的特殊类型的线程创建的. 首先,UI线程是一种"线程",所以它具有一个线程应该具有的所有特征,比如有一个线程函数和一个线程ID. 其次,"UI线程"又是"特殊"的,这是因为UI线程的线程函数中会创建一种特殊的对象--窗体,同时,还一并负责创建窗体上的各种控件. 窗体和控件大家都很熟悉了,这些对象具有接收用户操作的功能,它们是

细说UI线程和Windows消息队列

在Windows应用程序中,窗体是由一种称为"UI线程(User Interface Thread)"的特殊类型的线程创建的. 首先,UI线程是一种"线程",所以它具有一个线程应该具有的所有特征,比如有一个线程函数和一个线程ID. 其次,"UI线程"又是"特殊"的,这是因为UI线程的线程函数中会创建一种特殊的对象--窗体,同时,还一并负责创建窗体上的各种控件. 窗体和控件大家都很熟悉了,这些对象具有接收用户操作的功能,它们是用

如何让你的ASP运行于非Windows平台

window 自从Micorsoft推出ASP技术后,由于ASP在创建动态交互式站点上的强大功能及其代码编写的简便性,使ASP在越来越多的Internet/Intranet/Extranet网站上得到了极其广泛的应用,尤其是涉及到数据库操作的网站应用系统更是倾向于采用ASP技术.但由于众所周知的原因,ASP只能工作于Microsoft的Windows NT平台+IIS Web Server服务器软件,在Windows9X+PWS也能使用,但那只能是调试或者学习用的,因而就决定了ASP应用的局限性

让你的ASP运行于非Windows平台

window 自从Micorsoft推出ASP技术后,由于ASP在创建动态交互式站点上的强大功能及其代码编写的简便性,使ASP在越来越多的Internet/Intranet/Extranet网站上得到了极其广泛的应用,尤其是涉及数据库操作的网站应用系统更是倾向于采用ASP技术.但由于众所周知的原因,ASP只能工作于Microsoft的Windows NT平台+IIS Web Server服务器软件,在Windows9X+PWS也能使用,但那只能是调试或者学习用的,因而就决定了ASP应用的局限性.