`

Windows中的PostMessage和SendMessage造成的程序性能低下

阅读更多

今天开始要处理大数据,大约有百G的地理道路数据文件,按照网格来切分生成地图数据。

普通情况下:

(1)单机运行时间太长,性能低
(2)内存不够

(3)本身算法是否可以改进

(4)C++程序写的性能问题,使用的是MFC框架,大量CString对象构建;频繁的 new/delete过程;多线程(对于纯计算类,多线程意义不大,多核并行似乎更合适)

 

-----------------------------------------------------

今天,发现,sendmessage在多线程中比postmessage耗时不在一个数量级上!去掉,就能提搞20%的性能.

 

PostMessage和SendMessage的区别:

PostMessage一个属于异步消息,并不等待消息处理,直接返回继续处理;因此,当多线程时,要比SendMessage快,SendMessage需要2次线程切换,才能继续,因此同步开销很大

另外,PostMessage的参数,必须注意到:

不是立即释放的局部变量,否则,当消息处理时,LPARAM指针指向的内容可能已经不存在或者发生改变。

CHAR szText[100]

 

PostMessage(XXX,NULL,szText);

 

--------------------------------------

当消息出来时,这个szText所在的函数已经指向完,其空间已经被回收了,因此,指向了一个不可访问的区域。

 

当PostMessage发送消息,比处理消息快时,还需要注意消息队列长度:

Windows   2000/XP:   There   is   a   limit   of   10,000   posted   messages   per   message   queue.   This   limit   should   be   sufficiently   large.   If   your   application   exceeds   the   limit,   it   should   be   redesigned   to   avoid   consuming   so   many   system   resources.   To   adjust   this   limit,   modify   the   following   registry   key:  

HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
Windows   NT
CurrentVersion
Windows
USERPostMessageLimit

The   minimum   acceptable   value   is   4000.

 

 

 

分享到:
评论

相关推荐

    PostMessage和SendMessage的区别

    通过详细解释PostMessage与SendMessage的工作原理,我们可以更好地理解这两种方法如何影响应用程序的性能和响应性。 ### PostMessage与SendMessage的基本概念 #### PostMessage函数 PostMessage函数用于将消息放入...

    c# 线程通信PostMessage SendMessage PeekMessage

    本主题将深入探讨`FindWindow`、`PostMessage`、`SendMessage`以及`PeekMessage`这四个关键函数,它们在Windows API中扮演着重要的角色,特别是在线程间通信和窗口消息处理方面。 1. **FindWindow**: `FindWindow...

    在C#中SendMessage和PostMessage的参数传递

    在C#中SendMessage和PostMessage的参数传递 在C#中可以使用Window API提供的SendMessage和PostMessage来传递参数。两者的区别简单介绍下:返回值的不同,我们先看一下 MSDN 里的声明: LRESULT SendMessage( HWND ...

    SendMessage与PostMessage区别

    在Windows编程中, SendMessage 和 PostMessage 是两个非常重要的API函数,它们都用于进程间或线程间的通信,向目标窗口发送消息。然而,两者的工作机制和应用场景有所不同。 **SendMessage** 函数是同步的,它会将...

    MFC程序通过SendMessage或PostMessage实现进程间通信,实现很简单

    首先,`SendMessage`和`PostMessage`都是Windows API中处理消息的核心函数,它们都用于在窗口之间发送消息。但两者的工作方式有所不同: 1. **SendMessage**: 这个函数会阻塞调用进程,直到接收进程处理完消息并...

    PostMessage SendMessage

    理解并熟练运用`PostMessage`和`SendMessage`是Windows编程中的基本技能,它们有助于实现复杂的应用程序逻辑和高效的线程通信。在处理多线程和用户界面交互时,正确使用这两个函数能显著提升程序的稳定性和用户体验...

    SendMessage PostMessage 消息处理详解

    在多线程环境中,正确地使用这两个函数对于保证程序的稳定性和性能至关重要。 此外,朱建强先生的作品可能还包括了一些安全使用和防止非法使用的提示,强调了用户在使用他的代码时应自行负责,这在分享和学习开源...

    MFC Sendmessage和Postmessage的使用

    2.两个对话框CMessageDlg和ConeDlg; 3.CMessageDlg为父窗口,ConeDlg为子窗口; 4.父窗口上有一个按钮用于弹出子窗口,子窗口也有一个按钮用来触发事件; 5.子窗口的按钮触发事件后,发送消息给父窗口,然后在...

    通过PostMessage,SendMessage将CString发送和发布到Windows

    标题中的“通过PostMessage,SendMessage将CString发送和发布到Windows”指的是在Microsoft的Windows操作系统环境中,使用C++编程语言,特别是MFC(Microsoft Foundation Classes)框架时,如何利用`PostMessage`和`...

    在C# API 消息处理 SendMessage PostMessage 进程通信 发消息 实例 文档资料

    主要示例在C#中的SendMessage,PostMessage,包含两个示例,一个资料文档,希望受用。 在C#中 API 消息处理 SendMessage PostMessage 进程通信 发消息 实例 文档资料

    QT 中使用 Windows API----SendMessage() 进行窗体间消息传递

    总结一下,通过结合QT和Windows API,我们可以利用`SendMessage()`函数实现在不同窗口之间的消息传递,提供了一种不同于QT信号槽机制的交互方式。这种方法虽然相对底层,但在某些特定场景下,例如跨线程通信或者需要...

    PostMessage 后台模拟按键 MOUSE VC原码

    `PostMessage`函数就是这样的一个工具,它允许程序在目标窗口的message queue中放置一个消息,而不是立即处理它。这个功能在自动化测试、游戏外挂、远程控制软件等领域有广泛应用。在VC++(Microsoft Visual C++)...

    MFC通过SendMessage或PostMessage实现两个进程通信功能,实现很简单

    资源包含两个源程序,里面是借用MFC的消息通信实现简单的两个进程间通信,嗯主要是通过SendMessage或PostMessage,功能实现简单便捷。该资源是我想搞点分数,分多的大佬麻烦赏赐点,没分的可以找找我另一个同样的...

    PostMessage

    PostMessage函数是Windows API中的一个核心消息处理函数,它允许应用程序在消息队列中放置一个消息,供其他线程或窗口处理。这个函数是进程间通信(IPC)和线程间通信的重要工具,广泛用于GUI(图形用户界面)程序的...

    进程间用postMessage发消息 ,在实际开发中的实例,

    在Windows中,可以使用`CreateFileMapping`和`MapViewOfFile`等函数创建和映射共享内存。这种方法适合需要快速交换大量数据的进程。 在实际开发中,选择哪种IPC方式取决于具体的需求,例如数据量、实时性、安全性等...

    C# 程序间通信(SendMessage方式)

    本示例聚焦于C#中的一个特定IPC方法:`SendMessage`,这是一个Windows API函数,常用于窗口消息的传递。在C#中,我们可以通过P/Invoke(平台调用)来使用这个API。 SendMessage是一个非常灵活的工具,它能够向指定...

    API :GetScrollBarInfo GetScrollInfo SetScrollInfo PostMessage SendMessage 的实例

    API :GetScrollBarInfo GetScrollInfo SetScrollInfo PostMessage SendMessage 的实例 忙得很没有整理,自用备忘!嫌文件乱就不要下啦,我自己用的,如果要下的,直接看form2里面的api类!

    控制台收发windows message

    在控制台程序中发送Windows消息,我们需要使用`PostMessage`或`SendMessage`函数。`PostMessage`是非阻塞的,它会立即将消息放入接收线程的消息队列,然后立即返回;而`SendMessage`是阻塞的,它会一直等到接收方...

    WindowsMessage客户端之间相互监听消息demo

    在WinForms中,我们可以使用`Control.SendMessage()`、`Control.SendKeys()`等方法发送自定义消息,或者使用`User32.dll`中的API函数,如`PostMessage()`和`SendMessage()`,向其他窗口发送消息。 在这个“Windows...

    Windows程序设计教程

    每个Windows窗口都有一个消息队列,消息通过PostMessage或SendMessage函数发送到队列,由GetMessage函数从队列中取出并由DispatchMessage分发到相应的窗口过程进行处理。 多线程编程在现代Windows应用中至关重要。...

Global site tag (gtag.js) - Google Analytics