求高人解决问题,这个问题困难小弟很久了,第一次写线程
我想实现一个这样的问题,当我点击按钮的时候,就开始我的计算,然后把计算的结果显示到编辑框中,在这里当我点击按钮的时候我创建一个线程用来进行计算。现在的问题来了,我要怎么样得到线程计算的结果。贴上代码吧。
- C/C++ code
//类头文件// 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); }}[解决办法]
猜测下,创建线程成功继续执行,线程函数还没跑完,m_nCount1Bits还没在线程函数中被赋值到就输出它的值,不对是正常的。
解决方法:创建线程时传入对话框的句柄或者指针,线程执行完了发送消息给对话框更新数据到界面上。
[解决办法]
线程函数内部要一个不中止的循环
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,并设置数据就可以了
[解决办法]
把主对话框句柄传递给线程,在线程内部进行实时更新。
[解决办法]
创建线程的时候将HWND窗口句柄以线程函数的参数的形式传递给线程,线程计算完成以后发送消息到UI线程,在UI线程的自定义消息响应函数中去更新编辑框控件的信息。
[解决办法]
在线程里发消息出来通知主界面
[解决办法]
[解决办法]
1、MFC创建线程用AfxBeginThread,创建后按钮响应代码就不要管了。
2、把对话框指针作为线程参数传进去,这样线程里就能用对话框了。
3、计算出结果后用对话框类GetDlgItem得到Edit指针,直接SetWindowText
[解决办法]
给CEdit控件SendMessage
[解决办法]
得到计算结果?那传给那个线程一个全局变量试试呢?等线程结束那个全局变量不就是结果了?