15,471
社区成员
发帖
与我相关
我的任务
分享
//类头文件
// ClxDlg 对话框
class ClxDlg : public CDialog
{
// 构造
public:
ClxDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_LX_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
CFileDialog m_FileDlg;
CString m_Result;
HANDLE m_CalcThread;//线程句柄
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedScan();
afx_msg void OnBnClickedCalc();
static DWORD WINAPI ThreadProc(PVOID lpParamer);//线程函数
private:
static __int64 m_nCount1Bits;//我想要计算得到的数据
static DWORD _start;
static DWORD _end;
static CString m_strFile;
};
//作为类函数 注意是静态的
DWORD WINAPI ClxDlg::ThreadProc(PVOID lpParamer)
{
DWORD qwNumOf1s;
qwNumOf1s = 一系列计算所得;
m_nCount1Bits = qwNumOf1s;//m_nCount1Bits 为我的类成员变量
}
//我点击按钮函数 这里我非常疑惑不知道这样子做对不对,感觉它根本就没有调用线程函数 第一次写线程所以不知道
void ClxDlg::OnBnClickedCalc()
{
// TODO: 在此添加控件通知处理程序代码
//int x = 0;
//DWORD dwThreadId;
m_CalcThread = CreateThread(NULL,0,ThreadProc,NULL,0,NULL);
if (m_CalcThread != NULL)
{
//m_Result 是一个CString
m_Result.Format(L"比特1的个数为:%I64d,耗时为:%d",m_nCount1Bits,_end - _start);
GetDlgItem(IDC_EDIT_RESULT)->SetWindowText(m_Result);
CloseHandle(m_CalcThread);
}
}
BOOL ClxDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化代码
//m_pProCtrl = (CProgressCtrl *)GetDlgItem(IDC_PROGRESS1);
m_Event = CreateEvent(NULL,TRUE,FALSE,NULL);//这里我设置一个事件,当我想停止的时候就让线程推出
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void ClxDlg::OnBnClickedCalc()//启动线程
{
// TODO: 在此添加控件通知处理程序代码
//int x = 0;
//HWND m_pCtrHand = GetDlgItem(IDC_PROGRESS1)->m_hWnd;
DWORD dwThreadId;
m_CalcThread = CreateThread(NULL,0,ThreadProc,(PVOID)this,0,&dwThreadId);
//这里创建线程
}
void ClxDlg::OnBnClickedStop()//停止线程 退出
{
// TODO: 在此添加控件通知处理程序代码
DWORD exitCode = 0;
GetExitCodeThread(m_CalcThread,&exitCode);
if (exitCode == STILL_ACTIVE)
{
m_pProCtrl->SetPos(0);
// m_bContinue = false;
::SetEvent(m_Event);//设置事件
}
}
DWORD WINAPI ClxDlg::ThreadProc(PVOID lpParamer)//线程
{
if(WAIT_OBJECT_0 == ::WaitForSingleObject(m_Event,0))//我这里设置对吗?需要怎么改进 ,我想让他等待退出
return 0;
else
{
计算
}
}