消息响应与响应消息
消息响应与响应消息
都是今天写代码遇到的点阻碍,浪费了一个多小时才调试出,个人认为Microsoft Windows需要对此负责……
一、 MessageBox()消息
这是一个消息循环的响应问题,假设一个窗口上绑定的消息需要共享一个变量,例如:
switch(LOWORD(wParam))
{
case IDC_BUTTON1:
{
count++;
}
break;
case IDC_BUTTON2:
{
count++;
}
break;
case IDC_BUTTON3:
{
MessageBox(NULL,"try",NULL,NULL);
count = 3;
}
break;
}
如果此时点击了按钮三之后再点击按钮二会出现什么情况?
很遗憾,count没有被更新,因为MessageBox()你没点确定,今天就在这浪费了很长时间,差点重写代码,个人认为,Windows如果这么处理就好了:
MessageBox(hDlg,"try",NULL,NULL); //响应才能更新
即只去响应指定窗口句柄的消息..。
俺的解决方案:
先把该响应的响应了,再MessageBox()…
二、 TerminateProcess()消息
这个称不上消息的消息,假设在代码中:
HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
BOOL bRet = TerminateProcess(hProcess,NULL);
//建立进程快照
HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
此时的进程快照会如何?
很遗憾,还存留有hProcess的影子,Winodows没有来得及更新,个人感觉Windows应该对其做一消息响应,如果TerminateProcess()执行了,立即通知进程快照的内核,可以防止快照的时候留有痕迹,今天处理这个的时候还以为是ListView_DeleteAllItems()有问题,原来是这里慢了下..。
俺的解决方案:
Sleep(100);//100肯定够了,真的。
三、还有一个非消息响应的Windows的很奇怪的地方:
char* pData = (char*)malloc(1024); // 1
char pData[1024]; // 2
memset(pData,0,sizeof(pData));
一和二在memset的效果上一样么?
很遗憾,不一样,不过我还没debug出来为何不一样..
MSDN上memset的解释:
Remarks
Sets the first count characters of dest to the character c.
Security
Note Make sure that the destination buffer has enough room for
at least count characters. For more information, see Avoiding Buffer
Overruns.
没有提到stack和heap的区别,个人猜测,应该是堆表比较特殊,然后malloc出来的可能有某些合并的堆快,导致无法一次性刷新…
纯属猜测…
So…
有时候某些问题真的很囧…想是想不出来的 ,还得靠动手写,动手debug..。