求高人解决问题,这个问题困难小弟很久了,第一次写线程

weixiaoshashou 2011-08-25 11:34:25
我想实现一个这样的问题,当我点击按钮的时候,就开始我的计算,然后把计算的结果显示到编辑框中,在这里当我点击按钮的时候我创建一个线程用来进行计算。现在的问题来了,我要怎么样得到线程计算的结果。贴上代码吧。

//类头文件
// 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);
}

}
...全文
142 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hztj2005 2011-08-26
  • 打赏
  • 举报
回复
线程函数内部要一个不中止的循环
DWORD WINAPI ClxDlg::ThreadProc(PVOID lpParamer)
{
while(1){

if(isdatanull==null){

sleep(1000);

}else{

DWORD qwNumOf1s;
qwNumOf1s = 一系列计算所得;
m_nCount1Bits = qwNumOf1s;//m_nCount1Bits 为我的类成员变量
}
}


}

线程只要启动一次,应该放在对话框初始化之后就执行。

m_CalcThread = CreateThread(NULL,0,ThreadProc,NULL,0,NULL);

此后,只需要设置isdatanull=1,并设置数据就可以了



dahaiI0 2011-08-26
  • 打赏
  • 举报
回复
猜测下,创建线程成功继续执行,线程函数还没跑完,m_nCount1Bits还没在线程函数中被赋值到就输出它的值,不对是正常的。
解决方法:创建线程时传入对话框的句柄或者指针,线程执行完了发送消息给对话框更新数据到界面上。
呔妖怪来嘛 2011-08-26
  • 打赏
  • 举报
回复
给CEdit控件SendMessage
buyong 2011-08-26
  • 打赏
  • 举报
回复
1、MFC创建线程用AfxBeginThread,创建后按钮响应代码就不要管了。
2、把对话框指针作为线程参数传进去,这样线程里就能用对话框了。
3、计算出结果后用对话框类GetDlgItem得到Edit指针,直接SetWindowText
ttktw 2011-08-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xianglitian 的回复:]
在线程里发消息出来通知主界面
[/Quote]
线程中计算出结果后发送消息给主线程,主线程再修改编辑框
向立天 2011-08-26
  • 打赏
  • 举报
回复
在线程里发消息出来通知主界面
Eleven 2011-08-26
  • 打赏
  • 举报
回复
创建线程的时候将HWND窗口句柄以线程函数的参数的形式传递给线程,线程计算完成以后发送消息到UI线程,在UI线程的自定义消息响应函数中去更新编辑框控件的信息。
shiyunqiang 2011-08-26
  • 打赏
  • 举报
回复
把主对话框句柄传递给线程,在线程内部进行实时更新。
bjbjbh 2011-08-26
  • 打赏
  • 举报
回复
得到计算结果?那传给那个线程一个全局变量试试呢?等线程结束那个全局变量不就是结果了?
buyong 2011-08-26
  • 打赏
  • 举报
回复
线程函数return就退出线程了,不用Wait什么。
只要我按下这个停止按钮那么我的线程就可以终止。最好不要这样,非要这样用TerminateThread,但是后果自负。

[Quote=引用 9 楼 weixiaoshashou 的回复:]
现在问题来了,我怎么让它推出那个线程呢?就是我想通过一个按钮 只要我按下这个停止按钮那么我的线程就可以终止。

C/C++ code

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

// TODO: 在此添加额外的初始化代码
//m_pProCtrl = (CProgressCtrl *)G……
[/Quote]
weixiaoshashou 2011-08-26
  • 打赏
  • 举报
回复
现在问题来了,我怎么让它推出那个线程呢?就是我想通过一个按钮 只要我按下这个停止按钮那么我的线程就可以终止。

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
{
计算
}
}

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧