两个wince小程序,Gprs功分器测试,和开关机拨号测试,都已经顺利完工,现在有空回头学一下之前一知半解的细节问题。 1. 在cedit中打印log -- //在edittext中打印信息voidCSimTestDlg::ShowMessage(CStringstrMsg){ CEdit*pMsgInfo = (CEdit*)GetDlgItem(IDC
两个wince小程序,Gprs功分器测试,和开关机拨号测试,都已经顺利完工,现在有空回头学一下之前一知半解的细节问题。
1. 在cedit中打印log
--
//在edittext中打印信息 voidCSimTestDlg::ShowMessage(CStringstrMsg) { CEdit*pMsgInfo = (CEdit*)GetDlgItem(IDC_EDIT_TIPS); pMsgInfo->SetSel(pMsgInfo->GetWindowTextLength(),pMsgInfo->GetWindowTextLength()); //光标移动到当前所显示文本的末尾 pMsgInfo->ReplaceSel(strMsg); //在光标末尾插入字符串 pMsgInfo->ReplaceSel(_T("\r\n")); }
2.写log文件
--
//自己写的,解决了中文乱码和末尾有小方框的问题,可能还有隐患没发现 //写log记录到\ResidentFlash\开关机测试log.txt int CSimTestDlg::writelog(CString logStr){ CFilemyFile; char*pData = new char[500]; TCHAR*pStrLog = new TCHAR[500]; CStringstr_time = _T(""); CStringstr_result = _T(""); CStringstrFile = _T(""); SYSTEMTIMEsys; GetLocalTime(&sys ); str_time.Format(_T("%4d/%02d/%02d%02d:%02d:%02d"),sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond); str_result= str_time + logStr; intfileLength = str_result.GetLength(); wcscpy(pStrLog,(LPCTSTR)str_result); intcpylen =MyWideCharToMultiByte_test(pStrLog,pData,fileLength*2);//获得unicode转Ansi之后的长度,说明http://blog.csdn.net/sky1415/article/details/4137872 strFile= _T("\\ResidentFlash\\开关机测试log.txt"); myFile.Open(strFile,CFile::modeCreate | CFile::modeWrite |CFile::typeBinary|CFile::modeNoTruncate);//modeNoTruncate表示为续写方式 myFile.SeekToEnd(); myFile.Write(pData,cpylen); myFile.Flush(); myFile.Close(); delete[]pData; delete[]pStrLog; return0; } intCGPRS_SIGNAL_TESTDlg::MyWideCharToMultiByte_test(WCHAR*wchars, CHAR* schars,int scharsLen) { memset(schars,0, scharsLen); CStringm_snd = wchars; intlen = m_snd.GetLength(); CStringtmpstr(m_snd); //复制要发送的字符串 intmultibytelen = WideCharToMultiByte(//计算从Unicode转换到Ansi后需要的字节数 CP_ACP,//根据ANSI codepage转换 WC_COMPOSITECHECK|WC_DEFAULTCHAR, //转换出错用缺省字符代替 (LPCWSTR)tmpstr.GetBuffer(len),//要转换的字符串地址 len,//要转换的个数 0,//转换后字符串放置的地址 0,//最多转换字符的个数,为0表示返回转换Unicode后需要多少个字节 0,//缺省的字符:"\0" 0//缺省的设置 ); WideCharToMultiByte(//转换Unicode到Ansi CP_ACP,WC_COMPOSITECHECK |WC_DEFAULTCHAR, (LPCWSTR)tmpstr.GetBuffer(len), len,(char*)schars, //转换到缓冲区中 scharsLen,//最多个字节 0,0); returnmultibytelen; }
3. 调用系统程序并打开窗口
-- CreateProcess:http://baike.baidu.com/link?url=aLC_mEQNRDbEOf_wfXOxeH1Q2Q-XpIr9mXQDZKnHLXmPq-1niVJhYH05eTtCEnnE
#define FILE_PLAY_EXEC _T("\\ResidentFlash\\player\\PLAYER.EXE") #define FILE_PLAY_DATA _T("\\ResidentFlash\\PandaNormal.avi") PROCESS_INFORMATIONinfo; CreateProcess(FILE_PLAY_EXEC,FILE_PLAY_DATA, NULL, NULL, FALSE,CREATE_NEW_CONSOLE, NULL, NULL, NULL,&info);
4. 定时器设置
--
//.cpp注册定时器 BEGIN_MESSAGE_MAP(CGPRS_SIGNAL_TESTDlg,CDialog) //{{AFX_MSG_MAP(CGPRS_SIGNAL_TESTDlg) ON_BN_CLICKED(IDC_BUTTON_START,OnButtonStart) ON_BN_CLICKED(IDC_BUTTON_STOP,OnButtonStop) ON_WM_TIMER()//定时器设置 ON_MESSAGE(WM_GPRSRECV,OnGPRSRecv)//接收消息 //}}AFX_MSG_MAP END_MESSAGE_MAP() //.cpp实现OnTimer,对话框定时消失 voidCGPRS_SIGNAL_TESTDlg::OnTimer(UINT_PTRnIDEvent) { //TODO: Add your control notification handler code here HWNDhWnd = ::FindWindow(NULL, _T("提示")); //查找标题为B的窗口,返回窗口句柄 if(hWnd) //如果窗口句柄存在 { ::SendMessage(hWnd,WM_CLOSE,NULL, NULL);//可行 //DestroyWindow(); //关闭整个窗口,不行 //keybd_event(13,0,0,0);//模拟回车键按下,有啪的一声 //keybd_event(VK_RETURN,0,0,0); //模拟回车键按下,有啪的一声 } KillTimer(nIDEvent); //关闭定时器 CDialog::OnTimer(nIDEvent); } //.h文件中声明 afx_msg void OnTimer(UINT_PTRnIDEvent);//接收消息
5.设置控件背景色
--
//.h文件中,注册函数 afx_msg HBRUSH OnCtlColor(CDC* pDC,CWnd*pWnd, UINT nCtlColor); //cpp中重载消息响应函数 BEGIN_MESSAGE_MAP(CLytNandTestDlg, CDialog) //{{AFX_MSG_MAP(CLytNandTestDlg) ON_WM_CTLCOLOR() //}}AFX_MSG_MAP END_MESSAGE_MAP() //cpp文件中实现方法,根据id设置不同颜色 /************************************************************************/ /* UI显示 */ /************************************************************************/ HBRUSH CLytNandTestDlg::OnCtlColor(CDC*pDC,CWnd* pWnd, UINT nCtlColor) { HBRUSHhbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); //Are we painting theIDC_MYSTATIC control? We can use //CWnd::GetDlgCtrlID() to perform the most efficient test. if(pWnd->GetDlgCtrlID() == IDC_SHOW) { RETAILMSG(1,(_T("OnCtlColor\n"))); //Set the text color to red. pDC->SetTextColor(RGB(255,255,255)); m_brush= ::CreateSolidBrush( RGB(0,0,255)); //Set the background mode fortext to transparent //so background will show thru. pDC->SetBkMode(TRANSPARENT); //Return handle to our CBrushobject. hbr= m_brush; } returnhbr; }
6.注册表读写
-- 调用示例
//修改注册表,自动开机 reg->WriteRegMultiString(HKEY_LOCAL_MACHINE,_T("init\\"),L"Launch80",_T("\\ResidentFlash\\OurAPP\\开关机测试v1.3.exe")); reg->DeleteRegValue(HKEY_LOCAL_MACHINE,_T("init\\"),L"Launch80");
源码
/*************************************************************************** $Id$ Copyright (C) Centerm Information Co.,Ltd.All rights reserved. Model Name: Reg.cpp Description: 注册表测试 Environment: WinCE5.0、6.0 History: <author> <time> <version> <desc> Wangxuehong 2009-2-10 2.00 创建 ***************************************************************************/ #include "StdAfx.h" #include "Reg.h" // 向注册表写入字符串 void CReg::WriteRegString(HKEY hKey,TCHAR*Key, TCHAR *Name, TCHAR *Value, DWORD size) { HKEYhk; LONGreCode; DWORDdwDisposition; reCode=RegCreateKeyEx(hKey,Key,0,TEXT("S"),REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hk,&dwDisposition); if(reCode== ERROR_SUCCESS) { RegSetValueEx( hk,Name,0, REG_SZ,(LPBYTE)Value, (size + 1)*2 ); RegCloseKey(hk); } } // 向注册表写入字符串 void CReg::WriteRegStr(HKEY hKey,TCHAR*Key, TCHAR *Name, TCHAR *Value) { HKEYhk; LONGreCode; DWORDdwDisposition; reCode=RegCreateKeyEx(hKey,Key,0,TEXT("S"),REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hk,&dwDisposition); if(reCode== ERROR_SUCCESS) { RegSetValueEx(hk,Name,0, REG_SZ,(LPBYTE)Value, (lstrlen(Value)+1)*sizeof(TCHAR)); RegCloseKey(hk); } } // 向注册表写入多字符串 void CReg::WriteRegMultiString(HKEYhKey,TCHAR *Key, TCHAR *Name, TCHAR *Value) { HKEY hk; LONG reCode; DWORD dwDisposition; TCHAR *pStr; WORD Strl; pStr = Value; Strl = 0; while(*pStr) { while(*pStr) { pStr++; Strl++; } pStr++; Strl++; } reCode=RegCreateKeyEx(hKey,Key,0,TEXT("S"),REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hk,&dwDisposition); if(reCode== ERROR_SUCCESS) { RegSetValueEx(hk,Name,0,REG_MULTI_SZ, (LPBYTE)Value, (Strl+1)*2); RegCloseKey(hk); } } // 向注册表写入二进制 void CReg::WriteRegBin(HKEY hKey,TCHAR*Key, TCHAR *Name, VOID *Value, DWORD size) { HKEYhk; LONGreCode; DWORDdwDisposition; reCode=RegCreateKeyEx(hKey,Key,0,TEXT("S"),REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hk,&dwDisposition); if(reCode==ERROR_SUCCESS) { RegSetValueEx(hk,Name,0,REG_BINARY, (LPBYTE)Value, size*2); RegCloseKey(hk); } } // 向注册表写入INT void CReg::WriteRegInt(HKEY hKey, TCHAR*Key,TCHAR *Name, DWORD Value) { LONGreCode; HKEYhk; DWORDdwDisposition; reCode=RegCreateKeyEx(hKey,Key,0,TEXT("S"),REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, NULL,&hk,&dwDisposition); if(reCode== ERROR_SUCCESS) { RegSetValueEx(hk,Name,0,REG_DWORD, (LPBYTE)&Value, 4); RegCloseKey(hk); } } // 向注册表写入DWORD BOOL CReg::ReadRegDWord(HKEY hKey,TCHAR*Key, TCHAR *Name,DWORD *dwValue) { HKEY hk; DWORD data = 0; DWORD DataSize = sizeof(DWORD); DWORD dwType = 0; LONG reCode; reCode=RegOpenKeyEx(hKey,Key, 0, KEY_READ, &hk); if(reCode== ERROR_SUCCESS) { reCode= RegQueryValueEx(hk, Name,NULL, &dwType, (BYTE*)&data,&DataSize); RegCloseKey(hk); if(reCode==ERROR_SUCCESS) *dwValue = data; elsereturn FALSE; } else return FALSE; returnTRUE; } // 从注册表读取一个INT DWORD CReg::ReadRegInt(HKEY hKey,TCHAR*Key, TCHAR *Name) { HKEY hk; DWORD data = 0; DWORD DataSize = sizeof(DWORD); DWORD dwType = 0; LONG reCode; reCode= RegOpenKeyEx(hKey, Key, 0, KEY_READ, &hk); if(reCode== ERROR_SUCCESS) { reCode= RegQueryValueEx(hk, Name,NULL, &dwType, (BYTE*)&data,&DataSize); RegCloseKey(hk); } else data= 0; returndata; } // 从注册表读取字符串 DWORD CReg::ReadRegString(HKEY hKey,TCHAR*Key, TCHAR *Name, TCHAR* data) { HKEYhk; LONGreCode; DWORDDataSize = 1024; DWORDdwType; reCode= RegOpenKeyEx(hKey,Key,0,KEY_READ,&hk); if(reCode== ERROR_SUCCESS) { reCode=RegQueryValueEx(hk,Name,NULL,&dwType,(BYTE*)data,&DataSize); if(dwType != REG_SZ &&dwType != REG_MULTI_SZ ) { DataSize= 0; data[0]= 0; } RegCloseKey(hk ); returnDataSize; } else { data[0]= 0; return0; } } // 从注册表读取二进制 DWORD CReg::ReadRegBin(HKEY hKey,TCHAR*Key, TCHAR *Name, TCHAR* data) { HKEYhk; LONGreCode; DWORDDataSize = 1024; DWORDdwType; reCode= RegOpenKeyEx(hKey,Key,0,KEY_READ,&hk); if(reCode == ERROR_SUCCESS ) { reCode=RegQueryValueEx(hk,Name,NULL,&dwType,(BYTE*)data,&DataSize); RegCloseKey(hk); returnDataSize; } else { data[0]= 0; return0; } } // 删除注册表内容 void CReg::DeleteRegValue(HKEYhKey,TCHAR*Key,TCHAR *Name) { HKEYhk; LONGreCode; reCode= RegOpenKeyEx( hKey, Key, 0,KEY_ALL_ACCESS, &hk ); if(reCode== ERROR_SUCCESS) { reCode= RegDeleteValue(hk,Name); RegCloseKey(hk); } } // 复制注册表内容 BOOL CReg::CopyReg(HKEY hSKey, TCHAR*SKey,TCHAR *SName,HKEY hDKey, TCHAR *DKey, TCHAR *DName) { BOOLret = FALSE; HKEYshk, dhk; BYTEdata[1024]; DWORDDataSize = 1024; DWORDdwType, dwDisposition; if(RegOpenKeyEx(hSKey, SKey, 0, KEY_READ, &shk) == ERROR_SUCCESS) { if(RegCreateKeyEx(hDKey,DKey,0,TEXT("S"),REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS, NULL,&dhk,&dwDisposition)== ERROR_SUCCESS) { if(RegQueryValueEx(shk,SName,NULL,&dwType,data,&DataSize)==ERROR_SUCCESS) { if(RegSetValueEx(dhk,DName,0,dwType,data,DataSize) == ERROR_SUCCESS) { ret=TRUE; } } RegCloseKey(dhk); } RegCloseKey(shk); } returnret; } //设置NumLock状态 void CReg::SetNumLockStatus(BOOL NumLockOn) { SHORTKeyStatus; KeyStatus= GetKeyState(VK_NUMLOCK); if(KeyStatus&& 0x01)//检查状态为开 { if(!NumLockOn) { keybd_event(VK_NUMLOCK,(BYTE)0xe045,0,0); keybd_event(VK_NUMLOCK,(BYTE)0xe045,KEYEVENTF_KEYUP,0); } } else//检查状态为关 { if(NumLockOn) { keybd_event(VK_NUMLOCK,(BYTE)0xe045,0,0); keybd_event(VK_NUMLOCK,(BYTE)0xe045,KEYEVENTF_KEYUP,0); } } } //设置NumLock状态 void CReg::SetNumLockStatusFromReg() { BOOLnumlockStatus =ReadRegInt(HKEY_LOCAL_MACHINE,TEXT("SoftWare\\Start"),TEXT("NumLockOn")); SetNumLockStatus(numlockStatus ); } /* ************************************************* *Desc: 保存注册表 *Para: *Return: *Update Record: ************************************************* */ typedef DWORD (*pSaveRegData)(HWND hwnd); BOOL CReg::SaveReg() { #ifndef HIVE_BASED HINSTANCE hstbRegLib=NULL; pSaveRegDatadllSaveRegData; hstbRegLib= LoadLibrary(TEXT("SSReg.dll")); if( hstbRegLib == NULL ) { returnFALSE; } dllSaveRegData= (pSaveRegData) GetProcAddress( hstbRegLib,TEXT("SaveRegData") ); if( dllSaveRegData == NULL ) { returnFALSE; } else { dllSaveRegData(NULL ); } FreeLibrary(hstbRegLib ); #else DWORDdwRet = 0; if(ERROR_SUCCESS == RegFlushKey( HKEY_CURRENT_USER ) ) { //RETAILMSG(DEBUG_BY_AHZIT,(L"RegFlushKey [HKEY_CURRENT_USER]successed.\r\n")); } else { //RETAILMSG(DEBUG_BY_AHZIT,(L"RegFlushKey[HKEY_CURRENT_USER] failed.\r\n")); returnfalse; } dwRet= RegFlushKey( HKEY_LOCAL_MACHINE ); if(ERROR_SUCCESS != dwRet ) { //RETAILMSG(DEBUG_BY_AHZIT,(L"RegFlushKey[HKEY_LOCAL_MACHINE] failed, errorcode:[%ld].\r\n", dwRet)); returnfalse; } else { //RETAILMSG(DEBUG_BY_AHZIT,(L"RegFlushKey [HKEY_LOCAL_MACHINE]successed.\r\n")); } #endif returnTRUE; } </desc></version></time></author>
/*************************************************************************** $Id$ Copyright (C) Centerm Information Co.,Ltd.All rights reserved. Model Name: Reg.h Description: 注册表测试 Environment: WinCE5.0、6.0 History: <author> <time> <version> <desc> Wangxuehong 2009-2-10 2.00 创建 ***************************************************************************/ #pragma once class CReg { public: voidWriteRegString(HKEY hKey, TCHAR *Key, TCHAR *Name, TCHAR *Value,DWORD size); voidWriteRegStr(HKEY hKey, TCHAR *Key, TCHAR *Name, TCHAR *Value); voidWriteRegMultiString(HKEY hKey, TCHAR *Key, TCHAR *Name, TCHAR*Value); voidWriteRegBin(HKEY hKey, TCHAR *Key, TCHAR *Name, VOID *Value, DWORDsize); voidWriteRegInt(HKEY hKey, TCHAR *Key, TCHAR *Name, DWORD Value); BOOLReadRegDWord(HKEY hKey, TCHAR *Key, TCHAR *Name,DWORD *dwValue); DWORDReadRegInt(HKEY hKey, TCHAR *Key, TCHAR *Name); DWORDReadRegString(HKEY hKey, TCHAR *Key, TCHAR *Name, TCHAR* data); DWORDReadRegBin(HKEY hKey, TCHAR *Key, TCHAR *Name, TCHAR* data); voidDeleteRegValue(HKEY hKey,TCHAR *Key,TCHAR *Name); BOOLCopyReg(HKEY hSKey, TCHAR *SKey, TCHAR *SName,HKEY hDKey, TCHAR*DKey, TCHAR*DName); voidSetNumLockStatus(BOOL NumLockOn); voidSetNumLockStatusFromReg(); BOOLSaveReg(); }; </desc></version></time></author>
7. 将系统时间转化为CString, 查询文件是否存在,得到当前绝对路径
--
//系统时间转化为字符串 CString Systime2CString(SYSTEMTIME m_time){ TCHARszDateTime[100] = {0}; _stprintf(szDateTime, _T("%04d/%02d/%02d%02d:%02d:%02d"),m_time.wYear,m_time.wMonth, m_time.wDay,m_time.wHour,m_time.wMinute, m_time.wSecond); CString str = szDateTime; returnstr; } //文件是否存在 BOOL IsFileExist(LPTSTR lpFilePath) { WIN32_FIND_DATAm_fd; if(FindFirstFile(lpFilePath ,&m_fd) ==INVALID_HANDLE_VALUE ) returnFALSE; returnTRUE; } /* //获得当前绝对路径 void GetCurPath(WCHAR* strFilePath) { int i = 0; int sLen = 0; sLen = GetModuleFileName(NULL,strFilePath,260); for(i=sLen;i!=0;i--) { if(strFilePath[i]==WCHAR('\\')) { break; } strFilePath[i]= WCHAR('\0'); } }
8.关机
--
//关机挂起 void CSimTestDlg::halt(){ inttestCnt =mprofile->GetPrivateProfileInt(div,ID_testcnt, 0, iniFilePath); mprofile->WritePrivateProfileInt(div,ID_testcnt, testCnt+1,iniFilePath); Sleep(300); SetSystemPowerState(NULL,POWER_STATE_OFF, POWER_FORCE); }
9.ras拨号
//获取ppp网络状态 BOOL CSimTestDlg::IsConnect() { if(NULL != hRasConn) { RASCONNSTATUS rasConStatus; rasConStatus.dwSize = sizeof(RASCONNSTATUS); RasGetConnectStatus(hRasConn,&rasConStatus); if(RASCS_Connected == rasConStatus.rasconnstate) { return TRUE; } } return FALSE; } //移除已经拨上去的ras void CSimTestDlg::RemoveConnect(){ RASCONNentries[25]; DWORDbufsize=0; DWORDnumEntries=0; bufsize=25*sizeof(RASCONN); entries[0].dwSize=sizeof(RASCONN); RASCONNSTATUSstatus; status.dwSize=sizeof(RASCONNSTATUS); if(RasEnumConnections(entries,&bufsize,&numEntries)==0) { for(DWORDi=0;i<numentries if while retailmsg for ras disconnect break dword winapi pppdtread pdata csimtestdlg dworddwlast dworddwcurrent dwinterval="5000;" intwaitcount="0;" cstringlog='_T("");' cstringlog_whyfail='_T("");' intdialfailreason="0;" pdlg->reDialCnt= 0; DWORDstate_wait_for_event; //是否已经拨号失败即“断开连接” inttestCnt =mprofile->GetPrivateProfileInt(div, ID_testcnt, 0, iniFilePath); while(shouldEndTest==FALSE&& pDlg->reDialCnt m_test_state=STATE_TESTING_DAIL;//正在拨号的提示 //获得当前系统时间 dwLast= GetTickCount(); pDlg->RemoveConnect(); while(pDlg->IsConnect()&&shouldEndTest==FALSE) { if(pDlg->hRasConn!=NULL) { RETAILMSG(1,(_T("退出1\r\n"))); RasHangUp(pDlg->hRasConn); } Sleep(100);//100MS dwCurrent=::GetTickCount(); if(dwCurrent-dwLast>=dwInterval) { pDlg->SetDlgItemText(IDC_STATUS,_T("5s还没退出重启模块.....等待7S"));//ui pDlg->m_gpio=CreateFile(_T("GPI1:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); if(pDlg->m_gpio!= INVALID_HANDLE_VALUE ) { DeviceIoControl(pDlg->m_gpio,IOCTL_CDMA_OFF,NULL,NULL,NULL,NULL,NULL,NULL); if(myDelay(2000)==FALSE) { DialFailReason= -1; gotoDialFail; } DeviceIoControl(pDlg->m_gpio,IOCTL_CDMA_ON,NULL,NULL,NULL,NULL,NULL,NULL); if(myDelay(7000)==FALSE) { DialFailReason= -1; gotoDialFail; } CloseHandle(pDlg->m_gpio); pDlg->m_gpio=INVALID_HANDLE_VALUE; pDlg->SetDlgItemText(IDC_STATUS,_T("重启成功....."));//ui } } } if(shouldEndTest==TRUE) { gotoDialSuccOrAllFailExit; } //开始拨号 DWORDret; waitcount=0; RASDIALPARAMSrasDialParams; memset(&rasDialParams, 0,sizeof( RASDIALPARAMS ) ); rasDialParams.dwSize=sizeof(RASDIALPARAMS); _tcscpy(rasDialParams.szEntryName,_T("我的连接")); ret=RasDial(NULL,NULL,&rasDialParams,0xFFFFFFFF,pDlg->GetSafeHwnd(),&pDlg->hRasConn); if(ret!=0) { pDlg->SetDlgItemText(IDC_STATUS,_T("本次拨号建立失败")); pDlg->m_test_state=STATE_DAIL_FAIL; DialFailReason= -2; gotoDialFail; } //等待ppp连接 while(waitcountIsConnect()) { //只要连接成功则认为PPP正常 pDlg->m_test_state=STATE_DAIL_SUCC; gotoDialSuccOrAllFailExit; }else{ //如果已经监测到ras处在断开状态,直接退出等待 state_wait_for_event= WaitForSingleObject(pDlg->hEvent_exitWaitPPP,1000); if(state_wait_for_event==WAIT_OBJECT_0){ DialFailReason= -5; gotoDialFail; } } } if(waitcount>=60){ pDlg->SetDlgItemText(IDC_STATUS,_T("等待ppp连接超时")); DialFailReason= -3; }elseif(shouldEndTest==TRUE){ pDlg->SetDlgItemText(IDC_STATUS,_T("用户取消本次测试")); DialFailReason= -4; } gotoDialFail; //拨号失败,重试 DialFail: pDlg->m_test_state=STATE_DAIL_FAIL; { inttestCnt1 =mprofile->GetPrivateProfileInt(div,ID_dialFailCnt, 0, iniFilePath); mprofile->WritePrivateProfileInt(div,ID_dialFailCnt, testCnt1+1,iniFilePath); switch(DialFailReason){ case-1: log_whyfail=_T("软件退出\r\n"); break; case-2: log_whyfail=_T("RasDial失败\r\n"); break; case-3: log_whyfail=_T("等待ppp连接超时\r\n"); break; case-4: log_whyfail=_T("用户取消本次测试\r\n"); case-5: log_whyfail= _T("连接已断开\r\n"); break; } if(pDlg->reDialCnt==0){ log.Format(_T("第[ %d ]次开机,拨号失败原因:")+log_whyfail,(testCnt)); }else{ log.Format(_T("重拨( %d ),拨号失败原因:")+log_whyfail,pDlg->reDialCnt); } pDlg->writelog(log); pDlg->reDialCnt++; } }//while //拨号成功,或者重试次数用完 DialSuccOrAllFailExit: pDlg->m_bt_start.EnableWindow(FALSE); // pDlg->m_bt_stop.EnableWindow(TRUE); pDlg->m_bt_exit.EnableWindow(FALSE); //拨号成功退出 if(pDlg->m_test_state==STATE_DAIL_SUCC){ if(pDlg->reDialCnt==0){ log.Format(_T("第[ %d ]次开机,拨号成功\r\n"),testCnt); }else{ log.Format(_T("第[ %d ]次开机,重拨次数[ %d]\r\n"), testCnt,pDlg->reDialCnt); } pDlg->writelog(log); return0; } //用完重试次数退出 elseif(pDlg->reDialCnt>=10){ log.Format(_T("第[ %d ]次开机,重拨次数[ %d ]\r\n"),testCnt,pDlg->reDialCnt); pDlg->stopTest(); return-1; } //用户退出 elseif(shouldEndTest==TRUE){ log=_T("用户主动退出测试!"); return-2; } //其他情况 else return-3; } LRESULTCSimTestDlg::OnRasDialEvent(WPARAMwp, LPARAM lp) { RASCONNSTATErasState=(RASCONNSTATE)wp; switch(rasState) { caseRASCS_OpenPort: SetDlgItemText(IDC_STATUS,_T("打开端口......")); break; caseRASCS_PortOpened: SetDlgItemText(IDC_STATUS,_T("端口已打开.")); break; caseRASCS_ConnectDevice: SetDlgItemText(IDC_STATUS,_T("连接设备......")); break; caseRASCS_DeviceConnected: SetDlgItemText(IDC_STATUS,_T("设备已连接.")); break; caseRASCS_Authenticate: SetDlgItemText(IDC_STATUS,_T("验证用户及密码......")); break; caseRASCS_Authenticated: SetDlgItemText(IDC_STATUS,_T("通过.")); break; caseRASCS_Connected: SetDlgItemText(IDC_STATUS,_T("已连接.")); break; caseRASCS_Disconnected: SetDlgItemText(IDC_STATUS,_T("连接已断开.")); //?? //SetEvent(hEvent_exitWaitPPP); //hRasConn=NULL; //m_bt_exit.EnableWindow(TRUE); break; default: returnTRUE; } returnTRUE; } </numentries>

MySQLデータベースをアップグレードする手順には次のものがあります。1。データベースをバックアップします。2。現在のMySQLサービスを停止します。3。MySQLの新しいバージョンをインストールします。アップグレードプロセス中に互換性の問題が必要であり、Perconatoolkitなどの高度なツールをテストと最適化に使用できます。

MySQLバックアップポリシーには、論理バックアップ、物理バックアップ、増分バックアップ、レプリケーションベースのバックアップ、クラウドバックアップが含まれます。 1. Logical BackupはMySqldumpを使用してデータベースの構造とデータをエクスポートします。これは、小さなデータベースとバージョンの移行に適しています。 2.物理バックアップは、データファイルをコピーすることで高速かつ包括的ですが、データベースの一貫性が必要です。 3.インクリメンタルバックアップは、バイナリロギングを使用して変更を記録します。これは、大規模なデータベースに適しています。 4.レプリケーションベースのバックアップは、サーバーからバックアップすることにより、生産システムへの影響を減らします。 5. Amazonrdsなどのクラウドバックアップは自動化ソリューションを提供しますが、コストと制御を考慮する必要があります。ポリシーを選択するときは、データベースサイズ、ダウンタイム許容度、回復時間、および回復ポイントの目標を考慮する必要があります。

mysqlclusteringenhancesdatabaserobustnessnessnessnessnessnistandistributiondistributingdataacrossmultiplenodes.itesthendbenginefordatareplication andfaulttolerance、保証highavailability.setupinvolvesconfiguringmanagement、data、ssqlnodes、carefulmonitoringringandpe

MySQLのデータベーススキーマ設計の最適化は、次の手順を通じてパフォーマンスを改善できます。1。インデックス最適化:一般的なクエリ列にインデックスを作成し、クエリのオーバーヘッドのバランスをとり、更新を挿入します。 2。テーブル構造の最適化:正規化または反通常化によりデータ冗長性を削減し、アクセス効率を改善します。 3。データ型の選択:Varcharの代わりにINTなどの適切なデータ型を使用して、ストレージスペースを削減します。 4。パーティション化とサブテーブル:大量のデータボリュームの場合、パーティション化とサブテーブルを使用してデータを分散させてクエリとメンテナンスの効率を改善します。

tooptimizemysqlperformance、soflowthesesteps:1)properindexingtospeedupqueries、2)useexplaintoanalyzeandoptimize Queryperformance、3)AductServerContingSettingStingsinginginnodb_buffer_pool_sizeandmax_connections、4)

MySQL関数は、データ処理と計算に使用できます。 1.基本的な使用には、文字列処理、日付計算、数学操作が含まれます。 2。高度な使用法には、複数の関数を組み合わせて複雑な操作を実装することが含まれます。 3.パフォーマンスの最適化では、Where句での機能の使用を回避し、GroupByおよび一時テーブルを使用する必要があります。

MySQLでデータを挿入するための効率的な方法には、次のものが含まれます。1。insertInto ...値構文、2。LoadDatainFileコマンドの使用、3。トランザクション処理の使用、4。バッチサイズの調整、5。Insurtignoreまたは挿入の使用...

MySQLでは、AlterTabletable_nameaddcolumnnew_columnvarchar(255)afterexisting_columnを使用してフィールドを追加し、andtabletable_namedopcolumncolumn_to_dropを使用してフィールドを削除します。フィールドを追加するときは、クエリのパフォーマンスとデータ構造を最適化する場所を指定する必要があります。フィールドを削除する前に、操作が不可逆的であることを確認する必要があります。オンラインDDL、バックアップデータ、テスト環境、および低負荷期間を使用したテーブル構造の変更は、パフォーマンスの最適化とベストプラクティスです。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

ホットトピック









