Я довольно новичок в визуальной студии. Я пытаюсь загрузить изображения и отобразить их в пользовательском интерфейсе с помощью двух кнопок «Пуск» и «Стоп». Каждый раз, когда я заканчиваю подсчет общего количества кадров, в следующий раз, когда я нажимаю «Пуск», мои изображения загружаются быстрее, чем раньше, и в конечном изображении скорость настолько высока, что они просто исчезают или появляются как черные. Скорость потока или время загрузки изображений увеличивается с каждым циклом. Как я могу ограничить это .. или поставить временной интервал между показом двух изображений. Спасибо.
там код выглядит следующим образом:
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 кадров в секунду). Если не играть, обработчик таймера ничего не сделает.
Когда пользователь нажимает кнопку play, вы загружаете первое изображение, а затем устанавливаете флаг воспроизведения. Внутри обработчика таймера, он возьмет текущее загруженное изображение и перетянет его на экран, затем загрузит следующее изображение и вернется. Когда в последовательности больше нет изображений, вы снимаете флажок «воспроизведение».
Поскольку вы всегда отображаете текущее изображение при срабатывании таймера, не имеет значения, сколько времени потребуется для загрузки следующего изображения (если вы можете сделать это быстрее, чем при воспроизведении).
Других решений пока нет …