下面的是一个多线程的调用例子,应该已经比较完善了,这段时间一直在用多线程编程,但是老控制不好线程的产生和清理,这个参考的例子觉得比较完美了,也是给刚接触多线程的朋友一些参考,大家一起学习和进步。
// FundManageDlg.h : 头文件
#pragma once
// CFundManageDlg 对话框
class CFundManageDlg : public CDialogEx
{
// 构造
public:
CFundManageDlg(CWnd* pParent = NULL); // 标准构造函数
enum { IDD = IDD_FUNDMANAGE_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
CString m_strDateTime;
public:
int GetDateTime(int &nDate, int &nTime, int &nMis);
int m_nDate;
int m_nTime;
int m_nMis;
afx_msg void OnBnClickedBtnStart();
BOOL m_bThrDelete;
HANDLE m_hThread;
HANDLE m_hEvent;
static DWORD WINAPI ThreadRun(LPVOID lpParam);
afx_msg void OnBnClickedBtnStop();
void Run();
};
CFundManageDlg::CFundManageDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CFundManageDlg::IDD, pParent)
, m_strDateTime(_T(""))
{
m_hEvent = NULL;
m_hThread = NULL;
m_bThrDelete = TRUE;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
BEGIN_MESSAGE_MAP(CFundManageDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CFundManageDlg::OnBnClickedBtnStart)
ON_BN_CLICKED(IDC_BUTTON2, &CFundManageDlg::OnBnClickedBtnStop)
END_MESSAGE_MAP()
HCURSOR CFundManageDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
int CFundManageDlg::GetDateTime(int &nDate, int &nTime, int &nMis)
{
SYSTEMTIME t;
GetLocalTime(&t);
nDate = 10000 * t.wYear + 100 * t.wMonth + t.wDay;
nTime = 10000 * t.wHour + 100 * t.wMinute + t.wSecond;
nMis = t.wMilliseconds;
return 0;
}
DWORD WINAPI CFundManageDlg::ThreadRun(LPVOID lpParam)
{
CFundManageDlg *dlg = (CFundManageDlg *)lpParam;
for ( ;; )
{
if ( dlg->m_bThrDelete == TRUE )
{
break;
}
dlg->Run();
WaitForSingleObject(dlg->m_hEvent, 2000);
}
return 0;
}
//需要线程处理的都在此进行
void CFundManageDlg::Run()
{
GetDateTime(m_nDate, m_nTime, m_nMis);
m_strDateTime.Format("%d | %d | %d", m_nDate, m_nTime, m_nMis % 100);
SetDlgItemText(IDC_EDIT1, m_strDateTime);
}
void CFundManageDlg::OnBnClickedBtnStart()
{
// TODO: 在此添加控件通知处理程序代码
if ( m_bThrDelete == TRUE )
{
m_bThrDelete = FALSE;
m_hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
m_hThread = ::CreateThread(0, 0, ThreadRun, this, 0, 0);
}
}
void CFundManageDlg::OnBnClickedBtnStop()
{
// TODO: 在此添加控件通知处理程序代码
if ( m_hThread )
{
m_bThrDelete = TRUE;
SetEvent(m_hEvent);
WaitForSingleObject(m_hThread, INFINITE);
CloseHandle(m_hThread);
m_hThread = NULL;
}
if ( m_hEvent )
{
CloseHandle(m_hEvent);
m_hEvent = NULL;
}
}