首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2012-01-15 
求高人解决问题,这个问题困难小弟很久了,第一次写线程我想实现一个这样的问题,当我点击按钮的时候,就开始

求高人解决问题,这个问题困难小弟很久了,第一次写线程
我想实现一个这样的问题,当我点击按钮的时候,就开始我的计算,然后把计算的结果显示到编辑框中,在这里当我点击按钮的时候我创建一个线程用来进行计算。现在的问题来了,我要怎么样得到线程计算的结果。贴上代码吧。

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
[解决办法]
得到计算结果?那传给那个线程一个全局变量试试呢?等线程结束那个全局变量不就是结果了?

热点排行