我们有一个应用程序使用窗口消息队列将数据从套接字传递到消费者HWND(以~2100Hz的速率).此应用程序已工作超过2年.最近,我们的应用程序已经开始出现问题,我们的应用程序没有触发/执行WM_TIMER.我认为这是由于数据被泵入消息队列.
我的问题是有一种方法可以确定给定线程/ HWND的消息队列中有多少未决消息?
我有一个页面可以作为一个独立的网页或在一个特殊的“看门狗框架”中工作,它将定期使用 window.top.postMessage('message', '*');
问题是,如果页面作为独立网页加载,将无法捕获这些消息。用户可能会一次打开该页面数小时甚至数天。
这些未捕获的消息是否会消失得无影无踪,或者它们是否被排队或类似的事情导致内存泄漏?
我经常将主窗体句柄传递给其他线程,以便它们可以将消息发送回主线程.我在2013年9月28日看到,Remy Lebeau说:
... TWinControl.Handle属性也不是线程安全的.您应该使用TApplication.Handle属性,或使用AllocateHWnd()创建自己的窗口.
在这个回答有关传递字符串的问题.
手柄属性如何不安全?它是否在程序的生命周期中发生变化?
https://github.com/GoogleChrome/puppeteer/blob/master/examples/custom-event.js展示了如何定义自己的事件,但没有展示如何将事件数据传输回 Puppeteer 外部的代码。
例如,如果我想postMessage使用 Puppeteer 读取代码中页面的事件数据来启动页面,您会如何做?
我正在尝试将消息从父窗口发布到它打开的子窗口。然而,该消息并未被发布。
在父窗口脚本中:
function editAnnotation(annotKey){
var annotString = annotToString();
//open up the child window addAnnot.html.
var editAnnotWindow = window.open("editAnnot.html", "Ratting","width=200,height=400,0,status=0,scrollbars=1");
//send a message containing all the info from the current field. This message will cause all the fields to be prepopulated w info from annotation
editAnnotWindow.postMessage(annotString, '*');
}
Run Code Online (Sandbox Code Playgroud)
在子窗口脚本中:
window.onload = addListeners();
/***********************************************************************
*
* Function that adds listeners for messages
*
*/
function addListeners() {
console.log("addListeners() called");
window.addEventListener('message', parseMessage, false);//listens for messages from the index.html file page
}
function parseMessage(event){ …Run Code Online (Sandbox Code Playgroud) 我想让我的应用程序兼容 64 位。我正在努力处理 PostMessage 和 LPARAM。我通过 PostMessage 发送一个类的实例。我想知道将值test_data转换为 LPARAM 是否正确。
请看一下下面的代码:
// Data to send
TMyData=class
Data1: string;
Data2: byte;
Data3: TDateTime;
end;
// send
procedure TTestClass1.PostTestData(AData1: string; AData2: byte; AData3: TDateTime);
var
test_data: TMyData;
begin
test_data:= TMyData.Create;
test_data.Data1:= AData1;
test_data.Data2:= AData2;
test_data.Data3:= AData3;
PostMessage(my_handle,WM_MY_MESSAGE,0,LPARAM(test_data));
end;
// receive
procedure TTestClass2.Message_WM_MY_MESSAGE(var Msg: TMessage);
var
test_data: TMyData;
begin
test_data := TMyData(Msg.LParam); // is this also compatible with 64 Bit?
try
// Do some work
finally
test_data.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
上面的代码兼容64位吗?
环境:Win32,C/C++
所有三个(3)都可以用于线程向main()发信号通知它已经完成了一个操作.
但哪一个是所有人中最快的信号?
嗯...
我的应用程序有一个工作线程,我使用PostMessage将字符串发送到主线程.对于1条消息,字符串在到达主线程中的消息处理程序时被截断.
字符串在工作线程中由一串原始数据构成,如下所示.它在最后的'20'结束.
'01010000000030000102000008850008855343414E204544474520000000000000000000'
解码到我要发送的字符串中它看起来像这样,这是正确的:
'0100 0.50000 LSB0288.588.5SCAN EDGE'
创建"SCAN EDGE"部分并发布它的代码是:tmp和s_out是字符串
x := 35;
for i := 1 to 10 do
begin
tmp := '$' + copy(s,x,2);
TryStrToInt(tmp,dec);
s_out := s_out + chr(dec);
x := x + 2;
end;
PostMessage(MainHandle,UM_CLONE, UM_756, Integer(PChar(s_out)));
Run Code Online (Sandbox Code Playgroud)
主线程中的消息处理程序是:i是一个字符串
i := pChar(msg.LParam);
Run Code Online (Sandbox Code Playgroud)
当它到达主线程时,我在调试器中看起来像这样:
'0100 0.50000 LSB0288.588.5SCAN EDG'#0
我怎么能纠正这个?
是否有可能发送键没有一个程序SendMessage和PostMessageAPI?
是否有机会使用window.postmessage()在同一浏览器的不同选项卡中的两个不同应用程序之间进行通信?
我知道你可以在应用程序和iFrame之间做到这一点,但不同的标签呢?
更新:
案例场景:
用户在一个选项卡中播放来自vk.com的音频
用户开始在另一个标签页面中播放来自youtube.com的视频
youtube.com将postmessage()发送到视频开始播放的vk.com
谢谢
postmessage ×10
delphi ×4
javascript ×3
winapi ×3
sendmessage ×2
64-bit ×1
c ×1
cross-domain ×1
delphi-7 ×1
events ×1
memory-leaks ×1
message ×1
puppeteer ×1
sendkeys ×1