我的手上有一个严重的头疼.我正在研究我们的应用程序中的WPF组件的性能问题.
我们的.net应用程序非常庞大,几乎完全以windows形式存在.作为新计划的一部分,我们使用丰富的WPF ui重写了我们的核心组件之一.有很多WinForms < - > WPF互操作正在将这个东西粘合在一起,我怀疑这可能与我所看到的有些相关.
当我在ANTS探查器中分析慢速操作时,我发现在函数UnsafeNativeMethods.IntGetMessageW中发生了很多活动.ANTS报告了与我们所有业务逻辑和wpf渲染内容相结合的CPU活动.没有使用循环的该函数的托管代码下线,所以无论IntGetMessageW正在做什么,我都会追求.
我对win32编程并不是特别精通,但我知道在该上下文中消息循环的基础知识.我在这里看到的并不是我们手动完成的任何事情 - 在我们的代码中,我们不会直接与底层的messageloop本身或者可以在WPF调度程序上访问的任何更复杂的东西进行交互.
我们这里讨论的WPF组件是从Window继承而来的(即它不仅仅是一个控件/用户控件),我们使用ShowDialog从我们用于在此组件的旧WinForms版本上调用ShowDialog的更高级逻辑中显示它.我们在WPF组件中使用了一些WindowsFormsIntegrationHost控件,以保持与我们在WPF中无法重写的一些现有部分的兼容性.
我已经研究了好几天了,但是从来没有发现过很多东西.我一直在寻找关于输入消息(鼠标和键盘)的模糊相关帖子,但我不知道我能做些什么来验证它; 我已经尝试过屠宰代码来删除我能做的所有鼠标/键盘操作.
我很难到达任何地方,主要是因为这行代码是完全孤立的(不是我可以指出的实际来自我们的代码的任何内容的父或子),并且完全不透明它正在做什么.
这是ShowDialog函数的ANTS调用图的图像,显示了到达此处的调用路径:
我完全意识到这可能是必须要作为WPF的一部分完成的事情(尽管我们在WPF中编写的其他组件不显示此行为),或者这只是ANTS探查器中的一个非常奇怪的错误,但是在这一点我需要以某种方式验证它.如果有人能告诉我这里发生了什么或者可能会发生什么 - 或者指出某些方式我能够自己解决这个问题,我将以你的方式引导各种善意的业力.
更新:在回答下面的一些讨论时,这是ANTS的另一个视图 - 这个更好地说明了我遇到的困惑(这是在"CPU时间"模式下的ANTS视图).我匆忙审查了部分代码,但没有系统相关的功能:
谢谢你的期待!
为什么在Getmessage()创建消息队列之前需要peekMessage语句?
如何告诉预处理器不要替换特定的宏?
具体问题如下:Windows头文件定义GetMessage宏.
我的API的我的C++头文件有一个GetMessage方法.我不想重命名我的方法.但是在Windows上使用API时,包括windows.h用GetMessageA替换了我的GetMessage方法调用.
你好有人回答我为什么当我运行这个程序时,MessageBoxes的顺序是1,2,4,3而不是1,2,3,4.在我看来,程序应该在启动WM_USER + 11之前结束执行WM_PAINT程序,为什么不呢?
// Win32Project6.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "Win32Project6.h"
#define MAX_LOADSTRING 100
// Global Variables:
HINSTANCE hInst; // current instance
TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name
// Forward declarations of functions included in this code module:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
DWORD thread(LPVOID lpdwThreadParam);
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, …
Run Code Online (Sandbox Code Playgroud) 我有一个作为后台进程生成的进程,由于某种原因,似乎在后台抛出了一个消息框.所以这个过程挂了,我无法得到消息.
任何人都可以告诉我如何通过WinDbg或任何其他方式获取此消息中的文本?这是Windows Server 2008 x64上的x64本机c ++进程.
"挂起"线程(0)上的堆栈顶部是:
00000000`0012fdc8 00000000`76ad9e9e USER32!NtUserGetMessage+0xa
00000000`0012fdd0 00000001`40bb2b04 USER32!GetMessageW+0x34
[..internal code...]
00000000`0012ff60 00000000`7707c521 kernel32!BaseThreadInitThunk+0xd
00000000`0012ff90 00000000`00000000 ntdll!RtlUserThreadStart+0x1d
Run Code Online (Sandbox Code Playgroud)
谢谢!
getmessage ×5
c++ ×2
winapi ×2
.net ×1
ants ×1
delphi ×1
peekmessage ×1
performance ×1
postmessage ×1
windbg ×1
wpf ×1