📄 xugy03dlg.cpp
字号:
else
{
ulCount++;
threadParam->ulCount += nBytes;
if ((time1-time0-1) > 0)
{
threadParam->cur_rate = ((nBytes * 1000)
/(time1 - time0 - 1));
if (threadParam->cur_rate > threadParam->max_rate)
threadParam->max_rate = threadParam->cur_rate;
threadParam->total_time += time1-time0-1;
threadParam->bUpdate = TRUE;
}
else
{
if(nBytes > 0)
{
threadParam->cur_rate = (nBytes * 1000) / 1;
if (threadParam->cur_rate > threadParam->max_rate)
threadParam->max_rate = threadParam->cur_rate;
threadParam->total_time ++;
threadParam->bUpdate = TRUE;
}
}
}
} while(threadParam->bInThread);
}
}
CloseHandle(hDevice);
CloseHandle(hFile);
free(threadParam->pcIoBuffer);
threadParam->pcIoBuffer = NULL;
testDlg->m_OutStartBtn.EnableWindow(TRUE);
testDlg->m_OutStopBtn.EnableWindow(FALSE);
return 0;
}
UINT ReadWrite(void * pParam)
{
// MessageBox(NULL, "这是ReadWrite", "Woo提示:", 0);
char temp[80],cc[80];
BOOLEAN bResult = FALSE;
ULONG nBytes = 0, ulCount = 0, index;
ULONG pass = 0, fail = 0, repeat, i, cnt, seq;
struct CThreadParam *threadParam;
CXugy03Dlg *testDlg;
unsigned char rNum;
HANDLE hRead, hWrite, hDevice;
unsigned char *iobuf;
IO_BLOCK ioBlock;
IO_REQUEST ioRequest;
threadParam =(struct CThreadParam *) pParam;
threadParam->bInThread = FALSE;
testDlg = threadParam->testDlg;
threadParam->bUpdate = FALSE;
hRead = open_file(threadParam->pipe_name);
if(hRead == INVALID_HANDLE_VALUE)
{
strcpy(temp, "hRead = open_file 错误");
strcat(temp, threadParam->pipe_name);
testDlg->MessageBox((LPCSTR)temp, "ReadWrite");
testDlg->m_LoopStartBtn.EnableWindow(TRUE);
testDlg->m_LoopStopBtn.EnableWindow(FALSE);
return 0;
}
threadParam->pipe_name[5] +=1;
hWrite = open_file(threadParam->pipe_name);
if(hWrite == INVALID_HANDLE_VALUE)
{
CloseHandle(hRead);
strcpy(temp, "hWrite = open_file 错误");
strcat(temp, threadParam->pipe_name);
testDlg->MessageBox((LPCSTR)temp, "ReadWrite");
testDlg->m_LoopStartBtn.EnableWindow(TRUE);
testDlg->m_LoopStopBtn.EnableWindow(FALSE);
return 0;
}
hDevice = open_dev();
if(hDevice == INVALID_HANDLE_VALUE)
{
CloseHandle(hRead);
CloseHandle(hWrite);
strcpy(temp, "hDevice = open_dev 错误");
strcat(temp, threadParam->pipe_name);
testDlg->MessageBox((LPCSTR)temp, "ReadWrite");
testDlg->m_LoopStartBtn.EnableWindow(TRUE);
testDlg->m_LoopStopBtn.EnableWindow(FALSE);
return 0;
}
threadParam->pcIoBuffer = (unsigned char *)
malloc(threadParam->uiLength + 16);
if(threadParam->pcIoBuffer == NULL)
{
CloseHandle(hRead);
CloseHandle(hWrite);
strcpy(temp, "内存分配错误");
strcat(temp, "threadParam->pcIoBuffer");
testDlg->MessageBox((LPCSTR)temp, "ReadWrite");
testDlg->m_LoopStartBtn.EnableWindow(TRUE);
testDlg->m_LoopStopBtn.EnableWindow(FALSE);
return 0;
}
threadParam->ulCount = 0;
threadParam->ulData[0] = 0;
threadParam->ulData[1] = 0;
iobuf = (unsigned char *)
malloc (threadParam->uiLength + 16);
if(iobuf == NULL)
{
free(threadParam->pcIoBuffer);
threadParam->pcIoBuffer = NULL;
CloseHandle(hRead);
CloseHandle(hWrite);
strcpy(temp, "内存分配错误");
strcat(temp, "iobuf");
testDlg->MessageBox((LPCSTR)temp, "ReadWrite");
testDlg->m_LoopStartBtn.EnableWindow(TRUE);
testDlg->m_LoopStopBtn.EnableWindow(FALSE);
return 0;
}
if((hRead != INVALID_HANDLE_VALUE)
&&(hWrite != INVALID_HANDLE_VALUE))
{
int buffLen;
buffLen = threadParam->uiLength - sizeof(ulCount);
threadParam->bInThread = TRUE;
repeat = threadParam->ulData[2];
for (i = 0; (i < repeat) && (threadParam->bInThread); i++)
{
if(buffLen > 0)
{
rNum = 0;
for(index = 0; index < threadParam->uiLength; index++)
*(threadParam->pcIoBuffer + index) = rNum++;
cnt = threadParam->uiLength / 64;
for(index = 0; index < cnt; index++)
{
seq = ulCount * cnt + index;
memcpy(threadParam->pcIoBuffer + index * 64, &seq,
min(sizeof(ulCount), threadParam->uiLength));
}
}
ioRequest.uAddressL = 0;
ioRequest.bAddressH = 0;
ioRequest.uSize = threadParam->uiLength;
ioRequest.bCommand = 0x80; //start, write
ioBlock.uOffset = 0;
ioBlock.uLength = sizeof(IO_REQUEST);
ioBlock.pbyData = (PUCHAR)&ioRequest;
ioBlock.uIndex = SETUP_DMA_REQUEST;
bResult = DeviceIoControl(hDevice,
IOCTL_WRITE_REGISTERS,
(PVOID)&ioBlock,
sizeof(IO_BLOCK),
NULL,
0,
&nBytes,
NULL);
if(!bResult)
{
threadParam->bInThread = FALSE;
strcpy(temp, "DeviceIoControl write 错误");
strcat(temp, threadParam->pipe_name);
testDlg->MessageBox((LPCSTR)temp, "ReadWrite");
break;
}
bResult = WriteFile(hWrite,
threadParam->pcIoBuffer,
threadParam->uiLength,
&nBytes,
NULL);
if(!bResult)
{
DeviceIoControl(hWrite,
IOCTL_D12_RESET_PIPE,
0, 0, 0, 0,
&nBytes,
NULL);
wsprintf(cc, "DeviceIoControl写错误");
strcat(cc, threadParam->pipe_name);
testDlg->MessageBox((LPCSTR)cc, "ReadWrite");
}
if (1 == repeat)
CloseHandle(hWrite);
ioRequest.uAddressL = 0;
ioRequest.bAddressH = 0;
ioRequest.uSize = threadParam->uiLength;
ioRequest.bCommand = 0x81; //start, read
ioBlock.uOffset = 0;
ioBlock.uLength = sizeof(IO_REQUEST);
ioBlock.pbyData = (PUCHAR)&ioRequest;
ioBlock.uIndex = SETUP_DMA_REQUEST;
bResult = DeviceIoControl(hDevice,
IOCTL_WRITE_REGISTERS,
(PVOID)&ioBlock,
sizeof(IO_BLOCK),
NULL,
0,
&nBytes,
NULL);
if(!bResult)
{
threadParam->bInThread = FALSE;
strcpy(temp, "DeviceIoControl Read 错误");
strcat(temp, threadParam->pipe_name);
testDlg->MessageBox((LPCSTR)temp, "ReadWrite");
break;
}
bResult = ReadFile(hRead,
iobuf,
threadParam->uiLength,
&nBytes,
NULL);
if(!bResult)
{
DeviceIoControl(hRead,
IOCTL_D12_RESET_PIPE,
0, 0, 0, 0,
&nBytes,
NULL);
wsprintf(cc, "DeviceIoControl读错误");
strcat(cc, threadParam->pipe_name);
testDlg->MessageBox((LPCSTR)cc, "ReadWrite");
}
if (1 == repeat)
CloseHandle(hRead);
if(!memcmp(threadParam->pcIoBuffer, iobuf, threadParam->uiLength))
pass++;
else
fail++;
threadParam->ulData[0] = pass;
threadParam->ulData[1] = fail;
ulCount++;
threadParam ->ulCount += nBytes;
threadParam ->bUpdate = TRUE;
}
}
if (repeat != 1)
{
CloseHandle(hRead);
CloseHandle(hWrite);
CloseHandle(hDevice);
}
threadParam->bInThread = FALSE;
free(threadParam->pcIoBuffer);
threadParam->pcIoBuffer = NULL;
free(iobuf);
iobuf = NULL;
testDlg->m_LoopStartBtn.EnableWindow(TRUE);
testDlg->m_LoopStopBtn.EnableWindow(FALSE);
return 0;
}
UINT KillDialog(void * pParam)
{
// MessageBox(NULL, "这是KillDialog", "Woo提示:", 0);
struct CKillDialogParam *killParam;
struct CThreadParam *threadParam;
CXugy03Dlg *testDlg;
int i;
killParam = (struct CKillDialogParam *)pParam;
for(i=0; i<3; i++)
{
threadParam = (struct CThreadParam *)(killParam->tp[i]);
if(threadParam->bInThread !=FALSE)
{
threadParam->bInThread = FALSE;
WaitForSingleObject(threadParam->hThread,INFINITE);
}
}
testDlg = killParam->testDlg;
testDlg->EndDialog(0);
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CXugy03Dlg dialog
CXugy03Dlg::CXugy03Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CXugy03Dlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CXugy03Dlg)
// NOTE: the ClassWizard will add member initialization
m_OutBufferSize = _T("64");
m_InBufferSize = _T("32");
m_OutTotalBytes = _T("");
m_OutCurSpeed = _T("");
m_OutAverageSpeed = _T("");
m_OutMaxSpeed = _T("");
m_InTotalBytes = _T("");
m_InCurSpeed = _T("");
m_InAverageSpeed = _T("");
m_InMaxSpeed = _T("");
m_KeyStatus = _T("");
m_PassCount = _T("");
m_FailCount = _T("");
m_LoopBufSize = _T("32");
m_LoopTotalBytes = _T("");
m_LoopRepeatTimes = _T("2560");
m_LED1 = FALSE;
m_LED2 = FALSE;
m_LED3 = FALSE;
m_LED4 = FALSE;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
}
void CXugy03Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CXugy03Dlg)
DDX_Control(pDX, IDC_CHECK4, m_ctrlLED4);
DDX_Control(pDX, IDC_CHECK3, m_ctrlLED3);
DDX_Control(pDX, IDC_BUTTON6, m_LoopStopBtn);
DDX_Control(pDX, IDC_BUTTON5, m_LoopStartBtn);
DDX_Control(pDX, IDC_BUTTON4, m_InStopBtn);
DDX_Control(pDX, IDC_BUTTON3, m_InStartBtn);
DDX_Control(pDX, IDC_BUTTON2, m_OutStopBtn);
DDX_Control(pDX, IDC_BUTTON1, m_OutStartBtn);
DDX_Text(pDX, IDC_EDIT1, m_OutBufferSize);
DDX_Text(pDX, IDC_EDIT2, m_InBufferSize);
DDX_Text(pDX, IDC_EDIT4, m_LoopBufSize);
DDX_Text(pDX, IDC_EDIT5, m_LoopRepeatTimes);
DDX_Text(pDX, IDC_STATIC1, m_OutTotalBytes);
DDX_Text(pDX, IDC_STATIC2, m_OutCurSpeed);
DDX_Text(pDX, IDC_STATIC3, m_OutAverageSpeed);
DDX_Text(pDX, IDC_STATIC4, m_OutMaxSpeed);
DDX_Text(pDX, IDC_STATIC5, m_InTotalBytes);
DDX_Text(pDX, IDC_STATIC6, m_InCurSpeed);
DDX_Text(pDX, IDC_STATIC7, m_InAverageSpeed);
DDX_Text(pDX, IDC_STATIC8, m_InMaxSpeed);
DDX_Text(pDX, IDC_STATIC9, m_KeyStatus);
DDX_Text(pDX, IDC_STATIC10, m_PassCount);
DDX_Text(pDX, IDC_STATIC11, m_FailCount);
DDX_Text(pDX, IDC_STATIC12, m_LoopTotalBytes);
DDX_Check(pDX, IDC_CHECK1, m_LED1);
DDX_Check(pDX, IDC_CHECK2, m_LED2);
DDX_Check(pDX, IDC_CHECK3, m_LED3);
DDX_Check(pDX, IDC_CHECK4, m_LED4);
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CXugy03Dlg, CDialog)
//{{AFX_MSG_MAP(CXugy03Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnOutStart)
ON_BN_CLICKED(IDC_BUTTON2, OnOutStop)
ON_BN_CLICKED(IDC_BUTTON3, OnInStart)
ON_BN_CLICKED(IDC_BUTTON4, OnInStop)
ON_BN_CLICKED(IDC_BUTTON5, OnLoopStart)
ON_BN_CLICKED(IDC_BUTTON6, OnLoopStop)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_CHECK1, OnLED1)
ON_BN_CLICKED(IDC_CHECK2, OnLED2)
ON_BN_CLICKED(IDC_CHECK3, OnLED3)
ON_BN_CLICKED(IDC_CHECK4, OnLED4)
ON_EN_KILLFOCUS(IDC_EDIT1, OnOutBufferSize)
ON_EN_KILLFOCUS(IDC_EDIT2, OnInBufferSize)
ON_EN_KILLFOCUS(IDC_EDIT4, OnLoopBufSize)
ON_EN_KILLFOCUS(IDC_EDIT5, OnLoopRepeatTimes)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CXugy03Dlg message handlers
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -