📄 downloaddialog.cpp
字号:
// DownloadDialog.cpp : implementation file
//
#include "stdafx.h"
#include "FlashWriter.h"
#include "DownloadDialog.h"
#include "FlashWriterDlg.h"
#include "conio.h"
#include "ParallelPort.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDownloadDialog dialog
void InitParallel()
{
_outp(PORT_CONTROL, 0);
}
void SendOneByte(BYTE btData)
{
_outp(PORT_DATA, btData);
_outp(PORT_CONTROL, REQUEST_ONESEND_BIT);
//Sleep(10);
_outp(PORT_CONTROL, 0);
return;
}
/////////////////////////////////////////////
//
DWORD WINAPI DownloadThread(LPVOID lPara)
{
HANDLE hGiveIO, hFile = INVALID_HANDLE_VALUE;
DWORD dwFileSize;
const DWORD dwToRead = 6;
DWORD dwHaveRead;
BYTE btReadBuf[dwToRead];
const DWORD dwTryTime = 10;
CString csDisplay;
CDownloadDialog* pCDownloadDialog = (CDownloadDialog*)lPara;
hGiveIO = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hGiveIO == INVALID_HANDLE_VALUE)
{
TRACE("Couldn't access giveio device!");
return 0;
}
CloseHandle(hGiveIO);
hFile=CreateFile(pCDownloadDialog->m_csFilename,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_WRITE|FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
TRACE("Failed to open the file!");
return 0;
}
dwFileSize = GetFileSize(hFile,NULL);
(pCDownloadDialog->m_ProgressCtr).SetRange32(0,dwFileSize/dwToRead);
(pCDownloadDialog->m_ProgressCtr).SetPos(0);
csDisplay.Format(" %d kB",dwFileSize/1024);
pCDownloadDialog->SetDlgItemText(IDC_FILESIZE, csDisplay);
if(SetFilePointer(hFile,0,NULL,FILE_BEGIN)==0xffffffff)
{
TRACE("Failed to set the file pointer!");
CloseHandle(hFile);
return 0;
}
InitParallel();
for(DWORD i=0; i<dwFileSize/dwToRead; i++)
{
ReadFile(hFile,btReadBuf,dwToRead,&dwHaveRead,NULL);
if(dwToRead!=dwHaveRead)
{
TRACE("Not enough data!");
CloseHandle(hFile);
return 0;
}
while(1)
{
BOOL bDone = FALSE;
for(DWORD j=0; j<dwToRead; j++)
{
SendOneByte(btReadBuf[j]);
}
_outp(PORT_CONTROL, REQUEST_SIXSEND_BIT);
//Sleep(10);
_outp(PORT_CONTROL, 0);
while(1)
{
EnterCriticalSection(&(pCDownloadDialog->m_csExitThread));
if(pCDownloadDialog->m_bExitThread)
{
LeaveCriticalSection(&(pCDownloadDialog->m_csExitThread));
TRACE("Ended by the user!");
CloseHandle(hFile);
return 1;
}
LeaveCriticalSection(&(pCDownloadDialog->m_csExitThread));
if( (SIX_DONE_BIT|(BYTE)_inp(PORT_STATE)) )
{
bDone = TRUE;
break;
}
else if( (SIX_FAIL_BIT|(BYTE)_inp(PORT_STATE)) )
{
bDone = FALSE;
break;
}
}
if(bDone)
{
break;
}
}
(pCDownloadDialog->m_ProgressCtr).SetPos(i+1);
csDisplay.Format(" %d kB",(i+1)*6/1024);
pCDownloadDialog->SetDlgItemText(IDC_HAVEDOWN, csDisplay);
}
pCDownloadDialog->EndDialog(IDOK);
return 1;
}
CDownloadDialog::CDownloadDialog(CWnd* pParent /*=NULL*/)
: CDialog(CDownloadDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CDownloadDialog)
// NOTE: the ClassWizard will add member initialization here
m_hThread = NULL;
m_bExitThread = FALSE;
InitializeCriticalSection(&m_csExitThread);
m_csFilename = ((CFlashWriterDlg*)pParent)->m_csFilename;
m_hThread=CreateThread(NULL,0,DownloadThread,this,NULL,NULL);
if(NULL==m_hThread)
{
AfxMessageBox("Can not create download thread!");
}
//}}AFX_DATA_INIT
}
CDownloadDialog::~CDownloadDialog()
{
DeleteCriticalSection(&m_csExitThread);
}
void CDownloadDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDownloadDialog)
DDX_Control(pDX, IDC_DOWNLOAD_PROGRESS, m_ProgressCtr);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDownloadDialog, CDialog)
//{{AFX_MSG_MAP(CDownloadDialog)
ON_BN_CLICKED(IDC_CANCEL_DOWNLOAD, OnCancel)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDownloadDialog message handlers
void CDownloadDialog::OnCancel()
{
// TODO: Add your control notification handler code here
EnterCriticalSection(&m_csExitThread);
m_bExitThread = TRUE;
LeaveCriticalSection(&m_csExitThread);
// WaitForSingleObject(m_hThread,INFINITE);
WaitForSingleObject(m_hThread,500);
CloseHandle(m_hThread);
EndDialog(IDCANCEL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -