您的位置:首页 > 其它

MFC:界面多线程

2018-01-02 13:56 363 查看
创建一个对话框,添加三个编辑框,如下图所示:



对话框头文件代码 ThreadTestDlg.h :#pragma once
#include "AFXWIN.H"

#define _32Bit1_ int;
using _32Bit2_ = int;
typedef int _32Bit3_;

class ThreadTestDlg : public CDialogEx
{
DECLARE_DYNAMIC(ThreadTestDlg)

public:
ThreadTestDlg(CWnd* pParent = NULL);
virtual ~ThreadTestDlg();

#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ThreadTest };
#endif

protected:
virtual void DoDataExchange(CDataExchange* pDX);

DECLARE_MESSAGE_MAP()

_32Bit2_ _value;
CString _sValue;

public:
bool _isLoop;
std::mutex _mtEdit;
CString GetValue();

CWinThread* _pThread1;
CWinThread* _pThread2;
CWinThread* _pThread3;

CEdit _ctrlEdit1;
CEdit _ctrlEdit2;
CEdit _ctrlEdit3;

public:
virtual BOOL OnInitDialog();
virtual BOOL DestroyWindow();
};对话框源文件代码 ThreadTestDlg.cpp:
#include "stdafx.h"
#include "afxdialogex.h"
#include "ThreadTestDlg.h"

IMPLEMENT_DYNAMIC(ThreadTestDlg, CDialogEx)

ThreadTestDlg::ThreadTestDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(IDD_ThreadTest, pParent)
{
_isLoop = true;
}

ThreadTestDlg::~ThreadTestDlg()
{
}

void ThreadTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT1, _ctrlEdit1);
DDX_Control(pDX, IDC_EDIT2, _ctrlEdit2);
DDX_Control(pDX, IDC_EDIT3, _ctrlEdit3);
}

BEGIN_MESSAGE_MAP(ThreadTestDlg, CDialogEx)
ON_WM_NCDESTROY()
END_MESSAGE_MAP()

//#define ASWD
#ifdef ASWD
void Func()
{
2018年已到来
}
#endif

CString ThreadTestDlg::GetValue()
{
unique_lock<std::mutex> lck(_mtEdit);
_sValue.Format(_T("%d"), _value++);
lck.unlock();
return _sValue;
}

//==============================线程函数================================//
UINT ThreadFunc1(LPVOID pParam)
{
ThreadTestDlg* pDlg = (ThreadTestDlg*)pParam;
CEdit* pEdit = &pDlg->_ctrlEdit1;
while (pDlg->_isLoop)
{
pEdit->SetWindowText(pDlg->GetValue());
Sleep(10);
}
return 0;
}

UINT ThreadFunc2(LPVOID pParam)
{
ThreadTestDlg* pDlg = (ThreadTestDlg*)pParam;
CEdit* pEdit = &pDlg->_ctrlEdit2;
while (pDlg->_isLoop)
{
pEdit->SetWindowText(pDlg->GetValue());
Sleep(10);
}
return 0;
}

UINT ThreadFunc3(LPVOID pParam)
{
ThreadTestDlg* pDlg = (ThreadTestDlg*)pParam;
CEdit* pEdit = &pDlg->_ctrlEdit3;
while (pDlg->_isLoop)
{
pEdit->SetWindowText(pDlg->GetValue());
Sleep(10);
}
return 0;
}

//==============================消息处理函数================================//
BOOL ThreadTestDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

_value = 0;
_pThread1 = AfxBeginThread(ThreadFunc1, (LPVOID)this);
_pThread2 = AfxBeginThread(ThreadFunc2, (LPVOID)this);
_pThread3 = AfxBeginThread(ThreadFunc3, (LPVOID)this);
//_pThread3 = AfxBeginThread(ThreadFunc3, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);

return TRUE;
}

BOOL ThreadTestDlg::DestroyWindow()
{
_isLoop = false;
TerminateThread(_pThread1->m_hThread, NULL);
TerminateThread(_pThread2->m_hThread, NULL);
TerminateThread(_pThread3->m_hThread, NULL);
delete _pThread1;
delete _pThread2;
delete _pThread3;

return CDialogEx::DestroyWindow();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: