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

Posted

技术标签:

【中文标题】线程加载图像更快,直到它们在 Studio 中消失【英文标题】:Thread loading images faster until they disapear in Studio 【发布时间】:2012-09-13 03:52:41 【问题描述】:

我对视觉工作室很陌生。我正在尝试加载图像并将其显示在具有两个按钮启动和停止的 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;

【问题讨论】:

【参考方案1】:

一个相当简单的选择:

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

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

因为您总是在计时器触发时显示当前图像,所以加载下一张图像需要多长时间并不重要(只要您可以比播放速度更快)。

【讨论】:

以上是关于线程加载图像更快,直到它们在 Studio 中消失的主要内容,如果未能解决你的问题,请参考以下文章

在Flutter中更快地加载您的图像资源

android studio:需要加载随机图像和顶部随机文本,然后将它们保存为 jpeg 以与其他应用程序共享

Ionic2 UI组件之 ImageLoader

在 ListView 的自定义适配器中从 URL 加载图像(Android Studio)

在循环中保存图像比多线程/多处理更快

如何将图像从Firebase下载到Swift,然后更快地在UIImageView中显示?