MsgWaitForMultipleObjects_测试
1、个人感觉:
1.1、MSDN中(https://msdn.microsoft.com/en-us/library/ms684242.aspx),说:
“
dwWakeMask [in]
The input types for which an input event object handle will be added to the array of object handles.
”
ZC: 也就是说,会在 "event object handle"数组的最后 加入一个 事件对象句柄,这个 事件对象句柄 专门用于响应消息的。这里 我将它称为 "消息事件对象句柄"(它对应的对象就称为"消息事件对象")
1.1、MSDN中(https://msdn.microsoft.com/en-us/library/ms684242.aspx),说:
“
The QS_ALLPOSTMESSAGE and QS_POSTMESSAGE flags differ in when they are cleared. QS_POSTMESSAGE is cleared when you call GetMessage or PeekMessage, whether or not you are filtering messages. QS_ALLPOSTMESSAGE is cleared when you call GetMessage or PeekMessage without filtering messages (wMsgFilterMin and wMsgFilterMax are 0). This can be useful when you call PeekMessage multiple times to get messages in different ranges.
”
文中多次提到 "cleared",这里指 "消息事件对象"的状态。
ZC: 我做的测试结果:
QS_ALLPOSTMESSAGE : 只要消息不取走,"消息事件对象"就一直是 有信号的状态(不管是否过滤消息(GetMessage和PeekMessage函数的wMsgFilterMin和wMsgFilterMax参数))。消息被取走后,"消息事件对象" 才会变成 无信号状态。
QS_POSTMESSAGE:就算消息不取走,"消息事件对象" 还是会被设置成 无信号状态。未取走的消息还保留在消息队列中。
2、
3、Delphi
3.1、界面:

3.2、代码:
procedure TfrmMain.btnPost1000Click(Sender: TObject);
var hWnd1 :HWND;
begin
hWnd1 := StrToInt('$'+Trim(edtHWnd.Text));
PostMessage(hWnd1, WM_USER+, , );
end; procedure TfrmMain.btnPost1001Click(Sender: TObject);
var hWnd1 :HWND;
begin
hWnd1 := StrToInt('$'+Trim(edtHWnd.Text));
PostMessage(hWnd1, WM_USER+, , );
end; procedure TfrmMain.btnSend1001Click(Sender: TObject);
var hWnd1 :HWND;
begin
hWnd1 := StrToInt('$'+Trim(edtHWnd.Text));
SendMessage(hWnd1, WM_USER+, , );
end; procedure TfrmMain.btnPostCloseClick(Sender: TObject);
var hWnd1 :HWND;
begin
hWnd1 := StrToInt('$'+Trim(edtHWnd.Text));
SendMessage(hWnd1, WM_CLOSE, , );
end; procedure TfrmMain.btnSetEventClick(Sender: TObject);
var hEvent :Cardinal;
iErr :integer;
begin
hEvent := OpenEvent(EVENT_ALL_ACCESS, false, '__VC_MsgWaitForMultipleObjects_TEST_20180105__');
iErr := GetLastError;
Memo1.Lines.Add('OpenEvent return : '+IntToStr(hEvent)+', GetLastError : '+inttostr(iErr)); SetEvent(hEvent); CloseHandle(hEvent);
end; procedure TfrmMain.btnPost1100Click(Sender: TObject);
var hWnd1 :HWND;
begin
hWnd1 := StrToInt('$'+Trim(edtHWnd.Text));
PostMessage(hWnd1, WM_USER+, , );
end; procedure TfrmMain.btnSend1100Click(Sender: TObject);
var hWnd1 :HWND;
begin
hWnd1 := StrToInt('$'+Trim(edtHWnd.Text));
SendMessage(hWnd1, WM_USER+, , );
end;
4、VC6 测试代码:
#include <windows.h> #include <io.h>
#include <fcntl.h>
#include <stdio.h> HINSTANCE g_hInstance = ;
HWND g_hWnd = ; LRESULT CALLBACK ProcWindow(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void InitConsoleWindow()
{
AllocConsole();
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
int hCrt = _open_osfhandle((long)handle,_O_TEXT);
FILE * hf = _fdopen( hCrt, "w" );
*stdout = *hf;
} //////////// //////////// //////////// //////////// //////////// //////////// int WINAPI WinMain(
HINSTANCE _hInstance, // 当前 hInstance句柄
HINSTANCE _hPrevInstance, // 之前的 hInstance句柄
LPSTR _lpCmdLine, // 命令行
int _nCmdShow // 显示状态
)
{
g_hInstance = _hInstance; // 程序(.exe)的图标貌似默认是 资源文件中 的第一个图标??
WNDCLASS wndcls = {};
wndcls.style = CS_HREDRAW | CS_VREDRAW;
wndcls.lpfnWndProc = ProcWindow;
wndcls.cbClsExtra = ;
wndcls.cbWndExtra = ;
wndcls.hInstance = _hInstance;
wndcls.hIcon = LoadIcon(NULL, IDI_ERROR); // 窗口图标
wndcls.hCursor = LoadCursor(NULL, IDC_CROSS);
wndcls.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH); // 背景画刷
wndcls.lpszMenuName = NULL;
wndcls.lpszClassName= "zc20110929";
// 注册窗口类
RegisterClass(&wndcls); g_hWnd = CreateWindowEx(
NULL, //WS_EX_CLIENTEDGE,
wndcls.lpszClassName,
"ZC Window",
WS_OVERLAPPEDWINDOW,
, ,
, ,
NULL,
NULL, //g_hMenu,
_hInstance,
NULL); ShowWindow(g_hWnd, SW_SHOWNORMAL);
UpdateWindow(g_hWnd); MSG msg;
while(GetMessage(&msg, , , ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} HANDLE g_hEvent = NULL;
//#define PM_QS_POSTMESSAGE ((QS_POSTMESSAGE | QS_HOTKEY | QS_TIMER) << 16)
#define PM_QS_POSTMESSAGE ((QS_POSTMESSAGE) << 16) int g_iInc = ; LRESULT CALLBACK ProcWindow(
HWND _hWnd, // 窗口句柄
UINT _uMsg, // 消息ID(identifier)
WPARAM _wParam,
LPARAM _lParam)
{
switch (_uMsg)
{
case WM_USER+:
{
printf("Before MsgWaitForMultipleObjects .\n");
//DWORD dwRtn = MsgWaitForMultipleObjects(1, &g_hEvent, false, INFINITE, QS_SENDMESSAGE);
while ()
{
DWORD dwRtn = MsgWaitForMultipleObjects(, &g_hEvent, false, INFINITE, QS_SENDMESSAGE | QS_POSTMESSAGE);
if (dwRtn == )
break;
printf("MsgWaitForMultipleObjects return %d\n", dwRtn);
/*MSG msg;
::GetMessage(&msg, _hWnd, 2024, 2026);
printf("GetMessage get message : %d\n", msg.message);*/
MSG msg;
//dwRtn = ::PeekMessage(&msg, _hWnd, 2024, 2026, PM_REMOVE | PM_QS_POSTMESSAGE);// PM_QS_POSTMESSAGE
//dwRtn = ::PeekMessage(&msg, _hWnd, 2024, 2026, PM_QS_POSTMESSAGE);// PM_QS_POSTMESSAGE
//printf("PeekMessage get message(1) : %d, %d\n", msg.message, dwRtn);
dwRtn = ::PeekMessage(&msg, _hWnd, , , PM_NOREMOVE | PM_QS_POSTMESSAGE);
printf("PeekMessage get message(2) : %d, %d\n", msg.message, dwRtn);
if (msg.message == WM_CLOSE)
break; if (g_iInc == )
{
::GetMessage(&msg, _hWnd, , );
printf("GetMessage get message : %d\n", msg.message);
}
g_iInc ++;
printf("\t ==> %d\n", g_iInc);
if (g_iInc >= )
{//*
// system("pause");
::GetMessage(&msg, _hWnd, , );
printf("GetMessage get message : %d\n", msg.message);
// ::MessageBox(0, "Text", "caption", 0);
//*/
break;
}
}
/* DWORD WINAPI MsgWaitForMultipleObjects(
_In_ DWORD nCount,
_In_ const HANDLE *pHandles,
_In_ BOOL bWaitAll,
_In_ DWORD dwMilliseconds,
_In_ DWORD dwWakeMask
);*/
printf("After MsgWaitForMultipleObjects .\n");
return ;
}
case WM_USER+:
{
printf("WM_USER+1001\n");
return ;
}
case WM_USER+:
{
printf("WM_USER+1100\n");
return ;
}
case WM_CREATE:
{
InitConsoleWindow();
printf("WM_CREATE\n");
g_hEvent = ::CreateEvent(NULL, false, false, "__VC_MsgWaitForMultipleObjects_TEST_20180105__");
printf("HWND : %d , 0x%X\n", _hWnd, _hWnd);
return ;
}
case WM_PAINT:
{
char buf[] = {};
sprintf(buf, "HWND : %d , 0x%08X", _hWnd, _hWnd); HDC hDc;
PAINTSTRUCT ps;
hDc = BeginPaint(_hWnd, &ps);
TextOut(hDc, , , buf, strlen(buf));
EndPaint(_hWnd, &ps);
return ;
// break;
}
case WM_CLOSE:
case WM_DESTROY:
{
DestroyWindow(_hWnd);
PostQuitMessage();
return ;
}
}
return DefWindowProc(_hWnd, _uMsg, _wParam, _lParam);
}
5、
MsgWaitForMultipleObjects_测试的更多相关文章
- SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]
目录 SignalR系列目录 前言 也是好久没写博客了,近期确实很忙,嗯..几个项目..头要炸..今天忙里偷闲.继续我们的小系列.. 先谢谢大家的支持.. 我们来聊聊SignalR的性能监测与服务器的 ...
- Apache Ignite之集群应用测试
集群发现机制 在Ignite中的集群号称是无中心的,而且支持命令行启动和嵌入应用启动,所以按理说很简单.而且集群有自动发现机制感觉对于懒人开发来说太好了,抱着试一试的心态测试一下吧. 在Apache ...
- 测试一下StringBuffer和StringBuilder及字面常量拼接三种字符串的效率
之前一篇里写过字符串常用类的三种方式<java中的字符串相关知识整理>,只不过这个只是分析并不知道他们之间会有多大的区别,或者所谓的StringBuffer能提升多少拼接效率呢?为此写个简 ...
- TechEmpower 13轮测试中的ASP.NET Core性能测试
应用性能直接影响到托管服务的成本,因此公司在开发应用时需要格外注意应用所使用的Web框架,初创公司尤其如此.此外,糟糕的应用性能也会影响到用户体验,甚至会因此受到相关搜索引擎的降级处罚.在选择框架时, ...
- .NET Core系列 :4 测试
2016.6.27 微软已经正式发布了.NET Core 1.0 RTM,但是工具链还是预览版,同样的大量的开源测试库也都是至少发布了Alpha测试版支持.NET Core, 这篇文章 The Sta ...
- 渗透测试工具BurpSuite做网站的安全测试(基础版)
渗透测试工具BurpSuite做网站的安全测试(基础版) 版权声明:本文为博主原创文章,未经博主允许不得转载. 学习网址: https://t0data.gitbooks.io/burpsuite/c ...
- 在ubuntu16.10 PHP测试连接MySQL中出现Call to undefined function: mysql_connect()
1.问题: 测试php7.0 链接mysql数据库的时候发生错误: Fatal error: Uncaught Error: Call to undefined function mysqli_con ...
- 【初学python】使用python调用monkey测试
目前公司主要开发安卓平台的APP,平时测试经常需要使用monkey测试,所以尝试了下用python调用monkey,代码如下: import os apk = {'j': 'com.***.test1 ...
- CoreCRM 开发实录——Travis-CI 实现 .NET Core 程度在 macOS 上的构建和测试 [无水干货]
上一篇文章我提到:为了使用"国货",我把 Linux 上的构建和测试委托给了 DaoCloud,而 Travis-CI 不能放着不用啊.还好,这货支持 macOS 系统.所以就把 ...
随机推荐
- 计算概论(A)/基础编程练习1(8题)/2:苹果和虫子
#include<stdio.h> #include<math.h> int main() { /* n个苹果 每x小时能吃掉一个苹果 经过y小时 */ float n, x, ...
- LogUtil工具
package com.develop.web.util; import java.util.concurrent.locks.ReentrantLock; import org.slf4j.Logg ...
- Web开发笔记 #06# 前后端分离
前后端分离 关于“前后端分离”的深入讨论: 如何正确理解前后端分离? Web 前后端分离的意义大吗? 在上面有看到有谈“国外it公司分工”的回答,感觉挺有意思的.大概是讲国外it公司并不分前后端,只分 ...
- mysqldump 使用小结
语法: 备份某个数据库: mysqldump -uroot -p*** [options] –-databases DB_name > back_db_name.sql --databases: ...
- ELK学习笔记之F5利用ELK进行应用数据挖掘系列(1)-HTTP
0x00 概述 F5 BIGIP从应用角度位于网络结构的关键咽喉位置,可获取所有应用的流量,针对流量执行L7层处理,即便是TLS加密的流量也可以通过F5进行SSL offload.通过F5可以统一获取 ...
- android studio下载地址
AndroidStudio3.0 下载地址——高速下载 https://www.androiddevtools.cn/ 2017年08月20日 22:41:09 qq风轻云淡 阅读数:5559 ...
- Spring Boot 2 (二):Spring Boot 2 动态 Banner
Spring Boot 2 (二):Spring Boot 2 动态 Banner Spring Boot 2.0 提供了很多新特性,其中就有一个小彩蛋:动态 Banner. 一.配置依赖 使用 Sp ...
- 【题解】Luogu P1204 [USACO1.2]挤牛奶Milking Cows
原题传送门:P1204 [USACO1.2]挤牛奶Milking Cows 实际是道很弱智的题目qaq 但窝还是觉得用珂朵莉树写会++rp(窝都初二了,还要考pj) 前置芝士:珂朵莉树 窝博客里对珂朵 ...
- 01:adminLTE2基本使用
1.1 adminLTE介绍 1.adminLTE 介绍 1.基于Bootstrap3高度可定制的响应式管理模板,免去前端架构师大量的js和css的编写 2.adminLTE除了可以使用bootstr ...
- 20145212 罗天晨 WEB登陆发贴及会话管理功能的实现
会话管理简介 Cookie: cookie常用于识别用户. cookie 是服务器留在用户计算机中的小文件,每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie. 通过PHP能够创建并取回 ...