日本WTL是啥品牌
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日本WTL是啥品牌相关的知识,希望对你有一定的参考价值。
参考技术A 答:WTL由来 Wwin胜利之意 Ttarget目标之意 Llight光明之意 WTL的意思就是永远朝着光明正确的目标前进开取得胜利。为广大消费者提供高质量的服务
WTL CIdleHandler 的正确用法是啥?
【中文标题】WTL CIdleHandler 的正确用法是啥?【英文标题】:What is the proper use of WTL CIdleHandler?WTL CIdleHandler 的正确用法是什么? 【发布时间】:2018-02-28 20:23:26 【问题描述】:我正在努力学习WTL/Win32编程,对CIdleHandler mixin类的设计不是很了解。
对于 WTL 9.1,CMessageLoop 代码如下(来自 atlapp.h):
for(;;)
while(bDoIdle && !::PeekMessage(&m_msg, NULL, 0, 0, PM_NOREMOVE))
if(!OnIdle(nIdleCount++))
bDoIdle = FALSE;
bRet = ::GetMessage(&m_msg, NULL, 0, 0);
if(bRet == -1)
ATLTRACE2(atlTraceUI, 0, _T("::GetMessage returned -1 (error)\n"));
continue; // error, don't process
else if(!bRet)
ATLTRACE2(atlTraceUI, 0, _T("CMessageLoop::Run - exiting\n"));
break; // WM_QUIT, exit message loop
if(!PreTranslateMessage(&m_msg))
::TranslateMessage(&m_msg);
::DispatchMessage(&m_msg);
if(IsIdleMessage(&m_msg))
bDoIdle = TRUE;
nIdleCount = 0;
对空闲处理程序的实际调用非常简单。
// override to change idle processing
virtual BOOL OnIdle(int /*nIdleCount*/)
for(int i = 0; i < m_aIdleHandler.GetSize(); i++)
CIdleHandler* pIdleHandler = m_aIdleHandler[i];
if(pIdleHandler != NULL)
pIdleHandler->OnIdle();
return FALSE; // don't continue
IsIdleMessage 的调用也是如此
static BOOL IsIdleMessage(MSG* pMsg)
// These messages should NOT cause idle processing
switch(pMsg->message)
case WM_MOUSEMOVE:
#ifndef _WIN32_WCE
case WM_NCMOUSEMOVE:
#endif // !_WIN32_WCE
case WM_PAINT:
case 0x0118: // WM_SYSTIMER (caret blink)
return FALSE;
return TRUE;
我的分析如下:似乎每次“PeekMessage Drought”(没有消息发送到 Win32 应用程序的一段时间)一次,都会调用 OnIdle 处理程序。
但为什么只有一次?在 PeekMessage 的情况下,您不希望后台空闲任务不断被调用吗?此外,我觉得奇怪的是 WM_LBUTTONDOWN(用户在窗口上左键单击)会激活空闲处理(bDoIdle = True),但 WM_MOUSEMOVE 被显式调用以防止重新激活空闲处理。
谁能给我WTL Idle Loops(或更具体地说:CIdleHandler)的“正确”使用场景?我想我的期望是空闲处理功能将是小型的增量任务,只需说...... 100ms 即可完成。然后他们会在后台被反复调用。
但在 WTL 中似乎并非如此。或者我可能没有完全理解空闲循环?因为如果我有一个增量后台任务注册为 CIdleHandler... 那么如果用户离开窗口,该任务将只运行一次!如果没有将任何消息注入系统(例如 WM_LBUTTONDOWN),bDoIdle 变量将一直保持为 false!
有人对这一切有很好的解释吗?
【问题讨论】:
空闲处理程序仅用于更新 ui 状态。如果活动文档发生更改,请说工具栏上的启用/禁用按钮 我没有太多运气解释为什么你应该在没有任何事情发生的情况下运行代码,但是here is an example。 【参考方案1】:正如 cmets 中所说,OnIdle
处理程序应该在某些活动之后开始空闲时调用,尤其是。为了更新 UI。这解释了处理程序的“一次”调用:发生了一些事情,然后您有机会更新 UI 元素。如果您需要持续的后台处理,您应该使用计时器或工作线程。
WTL 示例建议使用空闲处理程序,例如在\Samples\Alpha\mainfrm.h。
Window 类获取线程的消息循环并请求空闲更新:
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
// ...
// register object for message filtering and idle updates
CMessageLoop* pLoop = _Module.GetMessageLoop();
ATLASSERT(pLoop != NULL);
pLoop->AddMessageFilter(this);
pLoop->AddIdleHandler(this);
稍后在消息处理和用户交互之后,空闲处理程序更新工具栏以反映可能的状态变化:
virtual BOOL OnIdle()
UIUpdateToolBar();
return FALSE;
【讨论】:
这个解释(以及其他 cmets)很有意义。关于空闲的 MFC 文档与您相矛盾:docs.microsoft.com/en-us/cpp/mfc/idle-loop-processing,但在这种情况下,我相信您对文档的建议。创建新线程/利用计时器进行“冗长的后台处理”更有意义。以上是关于日本WTL是啥品牌的主要内容,如果未能解决你的问题,请参考以下文章