线程加载图像的速度更快,直到它们在Studio中消失



我对visualstudio还很陌生。我正在尝试加载图像并将其显示在具有两个按钮"开始"one_answers"停止"的UI上。每次我完成总帧数的计数,下一次按下开始时,我的图像加载速度比以前更快,最终图像的速度非常快,以至于它们消失或显示为黑色。线程速度或图像加载时间随着每个周期而增加。我该如何限制这个。。或者在显示两个图像之间设置时间间隔。非常感谢。代码如下:

    void CmirrorImageDlg::OnBnClickedStart()
    {
        m_play = TRUE;
        CString num = NULL;
        num.Format(_T("Pause"));
        m_start.EnableWindow(false);
        m_stop.EnableWindow(true);
        m_stop.SetWindowTextW(num);
        m_pThread = AfxBeginThread(Operate, (LPVOID)this, THREAD_PRIORITY_NORMAL);
    }

    void CmirrorImageDlg::OnBnClickedStop()
    {
        m_play = FALSE;
        CString num = NULL;
        num.Format(_T("Resume"));
        m_start.EnableWindow(true);
        m_stop.EnableWindow(false);
        m_start.SetWindowTextW(num);
        m_count = 0;
        //m_pThread = AfxBeginThread(Operate, (LPVOID)this, THREAD_PRIORITY_ABOVE_NORMAL);
        // TODO: Add your control notification handler code here
    }

UINT CmirrorImageDlg::Operate(LPVOID param)
{
    CmirrorImageDlg* pDlg = (CmirrorImageDlg*) param;
    CString test;
    while ( pDlg->m_play && pDlg->m_count < TOTAL_FRAME_NUMBER)
    {
        test.Format(_T("images/%.4d.BMP"),pDlg->m_count);
        pDlg->hbitmap = (HBITMAP)LoadImage(NULL,test,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
        pDlg->inv_hbitmap = pDlg->GetInvertedBitmap(pDlg->hbitmap, TRUE); 
        pDlg->inv_hbitmap_1 = pDlg->GetInvertedBitmap(pDlg->hbitmap , FALSE);
        //CBitmap map = LoadBitmapW(test);
        //filePath = IDB_BITMAP1;
        //filePath++;

        //IDB_PICTURE2.LoadBitmapW(filePath);
        pDlg->m_picture.SetBitmap(pDlg->hbitmap);
        pDlg->m_picture_2.SetBitmap(pDlg->inv_hbitmap);
        pDlg->m_picture_3.SetBitmap(pDlg->inv_hbitmap_1);
        CString num = NULL;
        num.Format(_T("%d"),pDlg->m_count);
        pDlg->m_label.SetWindowTextW(num);
        // TODO: Add your control notification handler code here
        pDlg->m_count++;
    }
    if(pDlg->m_count >= TOTAL_FRAME_NUMBER)
    {
        CString num = NULL;
        num.Format(_T("%d"),0);
        pDlg->m_count = 0;
        pDlg->m_play= false;
        pDlg->m_label.SetWindowTextW(num);
        pDlg->m_picture.SetBitmap(NULL);
        pDlg->m_picture_2.SetBitmap(NULL);
        pDlg->m_picture_3.SetBitmap(NULL);
        CString num1 = NULL;
        num.Format(_T("Stop"));
        pDlg->m_start.EnableWindow(true);
        pDlg->m_stop.EnableWindow(false);
        pDlg->m_stop.SetWindowTextW(num);
        num.Format(_T("Start"));
        pDlg->m_start.SetWindowTextW(num);
        //pDlg->m_pThread->SuspendThread();
    }
    return 0;
}

一个相当简单的选项:

将对话框的WM_TIMER设置为每40毫秒激发一次(如果希望每秒25帧)。如果不播放,计时器处理程序将不执行任何操作。

当用户点击播放时,您将加载第一个图像,然后设置"播放"标志。在计时器处理程序中,它将获取当前加载的图像并将其闪电式传输到屏幕,然后加载下一个图像并返回。当序列中没有更多图像时,您将清除"播放"标志。

因为计时器启动时总是显示当前图像,所以加载下一个图像需要多长时间并不重要(只要你能比播放更快)。

最新更新