我写了一个多线程的程序,它可以做一些思考并打印出一些诊断信息。我注意到,如果我在程序运行时轻敲鼠标,程序运行得更快。现在我可以在这里详细介绍我是如何打印的......但是现在我会暂时停下来,因为我注意到在其他许多程序中,如果鼠标抖动,事情会发生得更快,不知是否有是许多人做出的一个经典错误,其中消息循环以某种方式被不移动的鼠标放慢。鼠标抖动/消息处理循环
编辑:我的“打印”方法如下...我有一个丰富的编辑控制窗口来显示文本。当我想打印某些内容时,我将新文本附加到窗口中的现有文本上,然后使用SendMessage(,WM_PAINT,0,0)重新绘制窗口。其实它有点复杂,我有多个丰富的编辑控制窗口,每个线程一个(我的4核PC上有4个线程)。我的粗线条“my_printf()”如下:
void _cdecl my_printf(char *the_text_to_add)
{
EnterCriticalSection(&my_printf_critsec);
GetWindowText(...); // get the existing text
SetWindowText(...); // append the_text_to_add
SendMessage(...WM_PAINT...);
LeaveCriticalSection(&my_printf_critsec);
}
我应该指出的是,我一直在使用这种打印方法多年来在非多线程程序,甚至没有注意到与鼠标器任何交互轻摇。
编辑:好的,这是我的整个messageloop运行在根线程上,而子线程完成他们的工作。子线程调用my_printf()来报告它们的进度。
for(;;)
{
DWORD dwWake;
MSG msg;
dwWake = MsgWaitForMultipleObjects(
current_size_of_handle_list,
hThrd,
FALSE,
INFINITE,
QS_ALLEVENTS);
if (dwWake >= WAIT_OBJECT_0 && dwWake < (WAIT_OBJECT_0 + current_size_of_handle_list))
{
int index;
index = dwWake - WAIT_OBJECT_0;
int j;
for (j = index+1;j < current_size_of_handle_list;j++)
{
hThrd[j-1] = hThrd[j];
}
current_size_of_handle_list--;
if (current_size_of_handle_list == 0)
{
break;
}
}
else if (dwWake == (WAIT_OBJECT_0 + current_size_of_handle_list))
{
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else if (dwWake == WAIT_TIMEOUT)
{
printmessage("TIMEOUT!");
}
else
{
printmessage("Goof!");
}
}
编辑:解决! 这可能是一个丑陋的解决方案 - 但我只是将超时从无限改为20ms,然后在if(dwWake == WAIT_TIMEOUT)部分换掉了printmessage(“TIMEOUT!”);为:
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
我还没有关闭这个问题,因为我仍然想知道为什么原始代码本身并不能工作。
你有任何基准来证明这一点吗?我听说,流行的JiggleMark 2009非常好。 – 2009-10-21 09:20:12
不要关闭它。对于下一个有类似问题的人可能会有用。 – 2009-11-03 17:01:31