// TestFileIODlg.cpp : 实现文件
//
#include "stdafx.h"
#include "TestFileIO.h"
#include "TestFileIODlg.h"
#include "FilesExplorerDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define WM_UPDATE_READING_PROGRESS WM_USER + 9
TCHAR m_MediaFilePath[MAX_PATH];
HANDLE mRcvThread = NULL;
BOOL mbRead = FALSE;
CTestFileIODlg * g_pThisDlg = NULL;
#define READ_BUFF_LEN 10*1024
#define LOOPS_PER_SECOND 10
// CTestFileIODlg 对话框
CTestFileIODlg::CTestFileIODlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestFileIODlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTestFileIODlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_PROGRESS1, m_ctlProgress);
}
BEGIN_MESSAGE_MAP(CTestFileIODlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, &CTestFileIODlg::OnBnClickedBeginReading)
ON_BN_CLICKED(IDC_BUTTON2, &CTestFileIODlg::OnBnClickedCancelReading)
ON_MESSAGE(WM_UPDATE_READING_PROGRESS, OnUpdateReadProgress)
ON_WM_DESTROY()
END_MESSAGE_MAP()
// CTestFileIODlg 消息处理程序
BOOL CTestFileIODlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
m_ctlProgress.SetPos(0);
g_pThisDlg = this;
ZeroMemory(m_MediaFilePath, sizeof(m_MediaFilePath));
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CTestFileIODlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
if (AfxIsDRAEnabled())
{
DRA::RelayoutDialog(
AfxGetResourceHandle(),
this->m_hWnd,
DRA::GetDisplayMode() != DRA::Portrait ?
MAKEINTRESOURCE(IDD_TESTFILEIO_DIALOG_WIDE) :
MAKEINTRESOURCE(IDD_TESTFILEIO_DIALOG));
}
}
#endif
void CTestFileIODlg::OnBnClickedBeginReading()
{
CFilesExplorerDlg dlg;
if(dlg.DoModal() != IDOK)
{
return;
}
ZeroMemory(m_MediaFilePath, sizeof(m_MediaFilePath));
_tcscpy(m_MediaFilePath, dlg.m_strSelectedFile);
if(_tcslen(m_MediaFilePath) <= 0)
return;
m_ctlProgress.SetPos(0);
m_ctlProgress.SetRange(0,100);
mbRead = TRUE;
DWORD threadID = 0;
mRcvThread = CreateThread(NULL, 0, ReadingThrd,
this, 0, &threadID);
//设置线程优先级
//SetThreadPriority(mRcvThread, THREAD_PRIORITY_ABOVE_NORMAL);
}
void CTestFileIODlg::OnBnClickedCancelReading()
{
mbRead = FALSE;
// Make sure the reading thread has been terminated
if (mRcvThread != NULL)
{
WaitForSingleObject(mRcvThread, INFINITE);
mRcvThread = NULL;
}
m_ctlProgress.SetPos(0);
}
//wParam - 完成的百分比
//lParam - 每秒读取的字节数,单位KB
LRESULT CTestFileIODlg::OnUpdateReadProgress(WPARAM wParam, LPARAM lParam)
{
m_ctlProgress.SetPos((UINT)wParam);
CString str;
if(lParam > 1000)
{
str.Format(L"%ld MB/s", lParam/1000);
}
else
{
str.Format(L"%ld KB/s", lParam);
}
GetDlgItem(IDC_EDIT1)->SetWindowText(str);
return 0;
}
DWORD WINAPI CTestFileIODlg::ReadingThrd(void * pParam)
{
CTestFileIODlg * pController = (CTestFileIODlg*) pParam;
TCHAR mediafile[256] = {0};
DWORD dwFileLen=0, dwTotalRead=0, dw=0;
_tcscpy(mediafile, m_MediaFilePath);
HANDLE hmediafile = CreateFile(mediafile,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hmediafile == INVALID_HANDLE_VALUE)
{
return 1;
}
dwFileLen = ::GetFileSize(hmediafile, 0);
// char buffer[READ_BUFF_LEN];
char * buffer = new char[READ_BUFF_LEN]; //动态分配内存,否则线程的栈空间可能不够
const INT bufflen = READ_BUFF_LEN;
UINT nTimeInterval = 1000/LOOPS_PER_SECOND;
TRACE(L"Estimated calculating time: %ld\n",
dwFileLen/(READ_BUFF_LEN * LOOPS_PER_SECOND));
DWORD dwSum = 0;
DWORD dwStart, dwCur, dwTick1;
dwTick1 = dwStart = GetTickCount();
while(mbRead)
{
BOOL bRet = ::ReadFile(hmediafile, (LPVOID)buffer, bufflen, &dw, NULL);
dwTotalRead += dw;
dwSum += dw;
if(!bRet || dwTotalRead >= dwFileLen)
{
::PostMessage(pController->m_hWnd, WM_UPDATE_READING_PROGRESS, 100, 0);
break;
}
dwCur = GetTickCount();
//if( dwTotalRead/(READ_BUFF_LEN * LOOPS_PER_SECOND) * 1000 > (dwCur - dwStart) )
//{
//DWORD tDiff = dwTotalRead/(READ_BUFF_LEN * LOOPS_PER_SECOND) * 1000 - (dwCur - dwStart);
// Sleep(tDiff);
//}
if(dwCur - dwTick1 > 1000)
{
DWORD dwPercent = (double)dwTotalRead/(double)dwFileLen*100.0;
DWORD dwSpeed = dwSum/(dwCur - dwTick1); //KB per second
::PostMessage(pController->m_hWnd, WM_UPDATE_READING_PROGRESS,
dwPercent, dwSpeed);
dwSum = 0;
dwTick1 = dwCur;
}
}
CloseHandle(hmediafile);
delete buffer;
TRACE(L"Actual time used: %ld\n", (GetTickCount()-dwStart)/1000);
TRACE(L"ReadingThrd exited. \n");
return 0;
}
void CTestFileIODlg::OnDestroy()
{
mbRead = FALSE;
// Make sure the receiving thread has been terminated
if (mRcvThread != NULL)
{
WaitForSingleObject(mRcvThread, INFINITE);
mRcvThread = NULL;
}
CDialog::OnDestroy();
}
- 1
- 2
- 3
- 4
前往页