以前的工作中涉及到了VC开发PC软件通过ADB通信与android设备连接的内容,现在简单记录下连接的流程
vc在界面初始化时启动后台工作者线程
bool CHPadSuiteDlg::StartThread()
{
//启动线程
// create events
if (hAdbEvent != NULL)
{
ResetEvent(hAdbEvent);
}
else
{
hAdbEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
}
if (hWriteEvent != NULL)
{
ResetEvent(hWriteEvent);
}
else
{
hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
}
if (hCloseEvent != NULL)
{
ResetEvent(hCloseEvent);
}
else
{
hCloseEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
}
hEventArray[0] = hCloseEvent; // highest priority
hEventArray[1] = hAdbEvent;
hEventArray[2] = hWriteEvent;
theApp.adbCommandPipe.init();
if (theApp.winThread = AfxBeginThread(AdbThread, this))
{
return true;
}
else
{
//发送失败消息
AfxMessageBox(theApp.GetResString(IDS_FAIL_THREAD));
SendMessage(WM_CLOSE);
return false;
}
}
这当中以管道的方式与adb创建链接
CPipe adbCommandPipe;//管道
然后是启动这个工作者线程
//工作者线程在后台工作,负责向设备发送adb命令
UINT CHPadSuiteDlg::AdbThread(LPVOID pParam)
{
CHPadSuiteDlg* pHandle = (CHPadSuiteDlg*)pParam;
pHandle->bThreadAlive = TRUE;
DWORD Event = 0;
for (;;)
{
Event = WaitForMultipleObjects(3, pHandle->hEventArray, FALSE, INFINITE);
switch (Event)
{
case 0:
{
// Kill this thread. break is not needed, but makes me feel better.
pHandle->bThreadAlive = FALSE;
theApp.exitThread = true;
TRACE(_T("***thread exit \r\n"));
AfxEndThread(100);
Sleep(100);
}
break;
case 1:
{
ResetEvent(pHandle->hAdbEvent);
TRACE(_T("***thread adb cmd \r\n"));
if(theApp.adbcmd)
{
int rsp = theApp.adbCommandPipe.SendCommand(theApp.adbcmd->cmd,NULL,theApp.adbcmd->waitResponse);
if(rsp < 32)
{
::SendMessage(theApp.activeWnd->m_hWnd,WM_USER_FAILURE, FAIL_CREATE_PIPE, 0x0);
}
}
}
break;
case 2:
{
theApp.bytesRead = 0;
ResetEvent(pHandle->hWriteEvent);
TRACE(_T("***thread write \r\n"));
//int rsp = theApp.adbCommandPipe.SendCommand(theApp.AdbFilePreName + theApp.strCommand,NULL,theApp.waitResponse);
int rsp = theApp.adbCommandPipe.SendCommand(theApp.strCommand,NULL,theApp.waitResponse);
if(rsp < 32)
{
::SendMessage(theApp.activeWnd->m_hWnd,WM_USER_FAILURE, FAIL_CREATE_PIPE, 0);
}
}
break;
}
}
return 0;
}
关键的是CPipe类的