⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mutithreaddlg.cpp

📁 如何获取GPS手机的位置信息,这个程序已严格通过测试
💻 CPP
字号:
// MutiThreadDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "多线程同步控制.h"
#include "MutiThreadDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CMutiThreadDlg 对话框

CMutiThreadDlg::CMutiThreadDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMutiThreadDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMutiThreadDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX,IDC_EDIT2,m_strReceive);
	DDX_Control(pDX, IDC_PROGRESS1, m_progress);
}

BEGIN_MESSAGE_MAP(CMutiThreadDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
	ON_WM_SIZE()
#endif
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDC_BT_Thread1, &CMutiThreadDlg::OnBnClickedBtThread1)
	//ON_BN_CLICKED(IDC_BT_Thread2, &CMutiThreadDlg::OnBnClickedBtThread2)
	ON_BN_CLICKED(IDC_BT_Thread3, &CMutiThreadDlg::OnBnClickedBtThread3)
	ON_BN_CLICKED(IDC_BT_OpenPort, &CMutiThreadDlg::OnBnClickedBtOpenport)
	ON_BN_CLICKED(IDC_BT_Receive, &CMutiThreadDlg::OnBnClickedBtReceive)
	ON_BN_CLICKED(IDC_BT_ClosePort, &CMutiThreadDlg::OnBnClickedBtCloseport)
	ON_BN_CLICKED(IDC_BT_ClearProcess, &CMutiThreadDlg::OnBnClickedBtClearprocess)
	//ON_WM_TIMER()//////////////////////////////////////////////////////////////////////添加时钟时需要添加的消息
END_MESSAGE_MAP()


// CMutiThreadDlg 消息处理程序


HANDLE hComm,hThread1,hThread2,hThread3; 
BOOL OpenComm(TCHAR* pPort = _T("COM6:"), int nBaudRate = 9600, int nParity = 1, int nByteSize = 8, int nStopBits = 0);
BOOL CloseComm();
void WriteComm(BYTE* pData, int nLength);
int ReadComm(BYTE* pData, int nLength);

CMutiThreadDlg::~CMutiThreadDlg()    //析构函数
{
	CloseComm();
}


BOOL CMutiThreadDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	m_progress.SetRange(0,100);
	m_progress.SetPos(0);
	//SetTimer(1,1000,NULL);
	
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CMutiThreadDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
	DRA::RelayoutDialog(
		AfxGetInstanceHandle(), 
		this->m_hWnd, 
		DRA::GetDisplayMode() != DRA::Portrait ? 
			MAKEINTRESOURCE(IDD_MY_DIALOG_WIDE) : 
			MAKEINTRESOURCE(IDD_MY_DIALOG));
}
#endif


BOOL OpenComm(TCHAR* pPort, int nBaudRate, int nParity, int nByteSize, int nStopBits)
{
    DCB dcb;       
    COMMTIMEOUTS timeouts = {1000,0,0,1000,0};         
	hComm = CreateFile(_T("COM6:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0, NULL);           
    if(hComm == INVALID_HANDLE_VALUE)    
	{
		AfxMessageBox(_T("打开串口失败,原因可能为:1,串口被占用,请重新启动您的手机!2,检测不到蓝牙设备!"));
		return FALSE;  
	}
    GetCommState(hComm, &dcb);        
    dcb.BaudRate = nBaudRate;
    dcb.ByteSize = nByteSize;
    dcb.Parity = nParity;
    dcb.StopBits = nStopBits;
	if(!SetCommState(hComm, &dcb))
	{
	    CloseHandle(hComm);
        hComm = INVALID_HANDLE_VALUE;
	    AfxMessageBox(_T("打开串口失败2!"));
	    return FALSE;
	}
	SetCommState(hComm, &dcb);    
    SetCommTimeouts(hComm, &timeouts);   
	PurgeComm(hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
  	AfxMessageBox(_T("打开串口成功!"));

    return TRUE;
}
// 关闭串口
BOOL CloseComm()
{
	AfxMessageBox(_T("串口已关闭!"));
    return CloseHandle(hComm);
}
// 写串口  
void WriteComm(BYTE* pData, int nLength)
{
    DWORD dwNumWrite = 0;   
    WriteFile(hComm, pData, (DWORD)nLength, &dwNumWrite, NULL);
}
// 读串口 
int ReadComm(BYTE* pData, int nLength)
{
    DWORD dwNumRead = 0;   
    ReadFile(hComm, pData, nLength, &dwNumRead, NULL);
    return (int)dwNumRead;
}

DWORD CMutiThreadDlg::FunProc1( LPVOID lpParameter)
{
	CMutiThreadDlg *dlg1 = (CMutiThreadDlg*)lpParameter;
	int j=4;
	while( j==4 )
	{
		for(int j=0;j<=4;j++)
		{
			CTime m_SysTime = CTime::GetCurrentTime();
			dlg1->SetDlgItemTextW(IDC_EDIT1,m_SysTime.Format(_T("%Y-%m-%d %H:%M:%S")));
			
		}
		Sleep(500);
		if(WaitForSingleObject(dlg1->ClosehThread1, 50) == WAIT_OBJECT_0)
		{
			break;
		}
	}
	return 0;
}


void CMutiThreadDlg::Operation()
{
	CWnd* iWnd = (CWnd* ) GetDlgItem(IDC_EDIT2);
	iWnd->SetWindowTextW(m_strReceive);

	if(m_strReceive=="")
	{
		AfxMessageBox(_T("没有接收到GPS信号!"));
	}	
}


DWORD CMutiThreadDlg::FunProc2( LPVOID lpParameter)
{
	CMutiThreadDlg *dlg2 = (CMutiThreadDlg*)lpParameter;
	memset(dlg2->buf, 0, sizeof(dlg2->buf));
	int readLen;
	while(1)
	{
		memset(dlg2->buf, 0, sizeof(dlg2->buf));
		int i=0;
		for(i=0;i<=1;i++)
		{
			readLen = ReadComm(dlg2->buf, sizeof(dlg2->buf));
			if(readLen)
			{
				dlg2->m_strReceive = dlg2->buf;
				dlg2->Operation();	
			}
		}
		if(WaitForSingleObject(dlg2->ClosehThread2,50) == WAIT_OBJECT_0)
		{
			break;
		}
	}
	return 0;

}
DWORD CMutiThreadDlg::FunProc3( LPVOID lpParameter)
{
	CMutiThreadDlg *dlg3 = (CMutiThreadDlg*)lpParameter;
	while(1)
	{
		for(int i=0; i<100;i++)
		{
	        CProgressCtrl *progress= (CProgressCtrl*)(dlg3->GetDlgItem(IDC_PROGRESS1));
			progress->SetPos(i);
			Sleep(100);
		}
		if(WaitForSingleObject(dlg3->ClosehThread3, 50) == WAIT_OBJECT_0)
		{
			break;
		}
	}
	return 0;
}


void CMutiThreadDlg::OnBnClickedBtThread1()
{
	// TODO: 在此添加控件通知处理程序代码
	hThread1 = CreateThread(NULL,0,FunProc1,this,0,NULL);

}
/*
void CMutiThreadDlg::OnBnClickedBtThread2()
{
	// TODO: 在此添加控件通知处理程序代码
    //SetTimer(1,1000, NULL);
}*/

void CMutiThreadDlg::OnBnClickedBtThread3()
{
	// TODO: 在此添加控件通知处理程序代码
	hThread3 = CreateThread(NULL,0,FunProc3,this,0,NULL);
}

void CMutiThreadDlg::OnBnClickedBtOpenport()
{
	// TODO: 在此添加控件通知处理程序代码
	OpenComm();
}

void CMutiThreadDlg::OnBnClickedBtReceive()
{
	// TODO: 在此添加控件通知处理程序代码
	hThread2 = CreateThread(NULL,0,FunProc2,this,0,NULL);
}

void CMutiThreadDlg::OnBnClickedBtCloseport()
{
	// TODO: 在此添加控件通知处理程序代码
	SetEvent(ClosehThread1);
	SetEvent(ClosehThread2);
	SetEvent(ClosehThread3);
	TerminateThread(hThread1,0);
	TerminateThread(hThread2,0);
	TerminateThread(hThread3,0);
	//hThread1=NULL;
	//hThread2=NULL;
	CloseComm();
}

void CMutiThreadDlg::OnBnClickedBtClearprocess()
{
	// TODO: 在此添加控件通知处理程序代码
     //KillTimer(1);
	 m_progress.SetPos(0);
	 TerminateThread(hThread3,0);
	 hThread3=NULL;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -