Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 延迟窗口在mfc上显示文本_C++_Multithreading_Mfc_Sleep - Fatal编程技术网

C++ 延迟窗口在mfc上显示文本

C++ 延迟窗口在mfc上显示文本,c++,multithreading,mfc,sleep,C++,Multithreading,Mfc,Sleep,我在做基于对话框的MFC游戏。 在游戏中有一个战斗阶段,我想在屏幕上显示每个文本,并有一点延迟, 我试过使用sleep,也试过CTime,但每次战斗都只显示最后一段文字。。。 下面是一个代码示例 void CDNDPprojectDlg::OnBnClickedAction() { CString Damaged; damage=me->Attack(enemy,WeID); SDialog.Format(_T("You done %d damage, using

我在做基于对话框的MFC游戏。 在游戏中有一个战斗阶段,我想在屏幕上显示每个文本,并有一点延迟, 我试过使用sleep,也试过CTime,但每次战斗都只显示最后一段文字。。。 下面是一个代码示例

void CDNDPprojectDlg::OnBnClickedAction()
{
    CString Damaged;
    damage=me->Attack(enemy,WeID);
    SDialog.Format(_T("You done %d damage, using %s,\r\n %s has %d HP left"), damage,Damaged,monName,enemy->getHP());
    Output.SetWindowTextW(SDialog);

    if(enemy->getHP() <1)
    {
        Won();
        return;
    }
    NextAttack();
    if(me->getHP() <1)
    {
        Died();
        return;
    }
}
我把…我想是穿线的问题,请帮帮我


谢谢

有一条艰难的路,一条容易的路,还有一条可耻的路

困难的方法是执行多线程-检查AfxBeginThread,将指针传递到CDNDPprojectDlg,并在每次睡眠后在那里执行该工作。这很难,因为在某一点上,当主线程和新线程访问公共资源时,您需要同步它们。。。有很多东西要学,但在那之前有很多痛苦

另一种方法是使用计时器SetTimer和override OnTimer

第三种方法是在VisualBasic中使用类似DoEvents的东西(哈,真丢脸!)。只要在你做了某事后调用它,你的屏幕就会刷新。我将否认任何关于已将该代码传递给您的信息

BOOL DoEvents()
{
    MSG msg;
    while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        if (msg.message == WM_QUIT)
        {
            return FALSE;
        }
        if (!AfxGetApp()->PreTranslateMessage(&msg))
        {
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
        }
    }
    return TRUE;
}

祝你好运

有一条艰难的路,一条容易的路和一条可耻的路

困难的方法是执行多线程-检查AfxBeginThread,将指针传递到CDNDPprojectDlg,并在每次睡眠后在那里执行该工作。这很难,因为在某一点上,当主线程和新线程访问公共资源时,您需要同步它们。。。有很多东西要学,但在那之前有很多痛苦

另一种方法是使用计时器SetTimer和override OnTimer

第三种方法是在VisualBasic中使用类似DoEvents的东西(哈,真丢脸!)。只要在你做了某事后调用它,你的屏幕就会刷新。我将否认任何关于已将该代码传递给您的信息

BOOL DoEvents()
{
    MSG msg;
    while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        if (msg.message == WM_QUIT)
        {
            return FALSE;
        }
        if (!AfxGetApp()->PreTranslateMessage(&msg))
        {
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
        }
    }
    return TRUE;
}

祝你好运

不丢脸。这种模式通常被称为Peek和Pump。即检查是否有任何消息在消息队列(PEEK)中等待,如果是这样,然后发送(泵)它们。哈哈-是的-这是可耻的,因为它当然是参照Visual Basic——我们都是C++ SnNBS,不是吗?这意味着在偷看和发送消息时会发生很多事情(比如破坏对话框),所以这不是处理刷新的最干净的方法。。。但这太容易了,很难通过。这并不丢脸。这种模式通常被称为Peek和Pump。即检查是否有任何消息在消息队列(PEEK)中等待,如果是这样,然后发送(泵)它们。哈哈-是的-这是可耻的,因为它当然是参照Visual Basic——我们都是C++ SnNBS,不是吗?这意味着在偷看和发送消息时会发生很多事情(比如破坏对话框),所以这不是处理刷新的最干净的方法。。。但这太容易了,很难通过。