单击“显示桌面” /全部最小化时,应用程序会延迟到最小程度

时间:2019-06-04 13:43:15

标签: c++ mfc windows-7-x64

我有一个相当大的应用程序,具有多个线程(例如Opengl渲染线程)和图形用户界面。单击标题栏中的最小化按钮时,应用程序将立即关闭。 但是,当单击Windows任务栏上的“显示桌面”或按Win + D或Win + M时,应用程序将延迟最小化(几秒钟后)。

我在(相当大的)代码库中搜索了SC_MINIMIZE,W_MINIMIZE等的出现,但均未成功。在单击“显示桌面”以检查是否锁定了某些线程之后,我也暂停了执行,但是找不到任何问题(但是,我在多线程领域的调试技能有些欠缺)。无论如何,标题栏中的快速最小化证明了它应该是可能的。

我试图更好地理解这个问题:当最小化命令来自应用程序外部时,会发生什么不同?这些命令在MFC应用程序中到达哪里?

我希望在单击任务栏上的“显示桌面”或按win + D或win + M时,应用程序能够迅速最小化。但是,它使延迟最小化。

其他信息:

启动应用程序时,仅调用一次CFrameWnd :: ActivateFrame(nCmdShow)。

这是渲染线程的创建:

m_threadObject = new MyRenderThread();

// If the thread is currently running, return error 
if( m_threadObject ->getCurrentStatus() != Stopped )
    return false;

m_threadObject ->setCurrentStatus( Initialized );
m_threadObject ->setContinueFlag( true );

// Create the thread
m_threadObject ->handle = AfxBeginThread(_sgThreadInternal::ThreadProc, (void*)m_threadObject);

// if the creation failed, reset status, and return error
if( m_threadObject ->handle == NULL )
{
    m_threadObject ->setCurrentStatus( Stopped );
    return false;
}

// if the wait flag is set, wait for the status to change
if( waitFlag )
{
    while( m_threadObject ->getCurrentStatus() == Initialized )
    {
        sgThread::sleep(1);
    }
}

线程之间的通信通过来回发送事件来进行,例如:

MyRenderThread::sendEvent([this, name]()
{
    if (!this->load(name))
    {
        this->unload();
    }
} );

但是我不相信线程是问题所在。 我发现单击最小化按钮时调用了OnSysCommand()消息处理程序,但是如果单击了显示桌面按钮,则不会调用该消息处理程序。在测试应用程序中,我创建的OnSysCommand()在单击show desktop时被调用。

磨牙更新:

如果您创建另一个应用程序,甚至使用EnumWindows()在所有窗口中进行迭代并发送,我的应用程序甚至会被最小化

::SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);

使用应用程序的窗口句柄。

似乎只显示了桌面,Win + D和Win + M被阻止了。

1 个答案:

答案 0 :(得分:0)

我找到了以下代码:

BOOL CMyApplicationApp::OnIdle(LONG lCount)
{
    CWinApp::OnIdle(lCount);

    [...]

    ::Sleep(5);
    if(m_mainFrame->IsIconic())
    {
        ::Sleep(100);
    }

    ::SwitchToThread();

    return TRUE;
}

在文档中阅读有关CWinApp :: OnIdle()的信息使我相信,sleep()有点多余。我假设原始开发人员想节省CPU周期或其他东西。删除代码后,应用程序会立即最小化。