MFC线程中的数据如何传回对话框
2个回答
展开全部
这是个问题
在线程中不能直接使用GetDlgItem等MFC函数
更不能使用UpdateData这个函数
解决方法还是有的
定义CListBox 类 变量 即 CListBox m_listbox;
新线程函数会参数接受一个void类型参数,所以可以把这个m_listbox的地址&m_listbox 传递过去
在线程函数里 通过CListBox * list=参数;
得到了变量的控制权,想干啥就干啥吧
请看下面的例子,道理是一样的
假如你的 编辑框 ID 为IDEDIT,请为你的编辑框添加一个 控件变量,假如这样
CEdit m_edit;//看清楚哦,不是CString类型,而是CEdit 类型
然后再 对话框 初始化函数 OnInitDialog()里的 //TODO位置 添加如下源码
AfxBeginThread(ThreadProc,&m_edit,THREAD_PRIORITY_NORMAL,0,0,NULL);//看清楚第二个参数。要传递给新的线程ThreadProc。
UINT ThreadProc(LPVOID Param)//他是全局函数,不可以定义在类里,最好放在初始化函数上面
{
CEdit *myeidt=(CEdit *)Param;//新线程终于得到了编辑框的控制权。
int i=0;
CString s="在线程里修改文本";
myeidt->SetWindowText(s);//修改编辑框文本。
}
}
在线程中不能直接使用GetDlgItem等MFC函数
更不能使用UpdateData这个函数
解决方法还是有的
定义CListBox 类 变量 即 CListBox m_listbox;
新线程函数会参数接受一个void类型参数,所以可以把这个m_listbox的地址&m_listbox 传递过去
在线程函数里 通过CListBox * list=参数;
得到了变量的控制权,想干啥就干啥吧
请看下面的例子,道理是一样的
假如你的 编辑框 ID 为IDEDIT,请为你的编辑框添加一个 控件变量,假如这样
CEdit m_edit;//看清楚哦,不是CString类型,而是CEdit 类型
然后再 对话框 初始化函数 OnInitDialog()里的 //TODO位置 添加如下源码
AfxBeginThread(ThreadProc,&m_edit,THREAD_PRIORITY_NORMAL,0,0,NULL);//看清楚第二个参数。要传递给新的线程ThreadProc。
UINT ThreadProc(LPVOID Param)//他是全局函数,不可以定义在类里,最好放在初始化函数上面
{
CEdit *myeidt=(CEdit *)Param;//新线程终于得到了编辑框的控制权。
int i=0;
CString s="在线程里修改文本";
myeidt->SetWindowText(s);//修改编辑框文本。
}
}
追问
举个例子吧:
在按钮Begin中创建线程FO,在线程B中将变量pages的值输出到对话框中的ID为IDC_LIST1的CListBox中。
代码怎么写?只要写按钮和线程函数就可以。
追答
为IDC_LIST1声明 一个 类变量 CListBox m_list;
在按钮Begin中创建线程FO
AfxBeginThread(FO,&m_list,THREAD_PRIORITY_NORMAL,0,0,NULL);//看清楚第二个参
新线程 如下
UINT FO(LPVOID Param)//他是全局函数,不可以定义在类里,最好放在初始化函数上面
{
CListBox *n_list=(CListBox *)Param;//新线程终于得到了编辑框的控制权。
//假设pages是CString类型,如果不是请转换。
n_list->AddString(pages);//在适当的位置使用
}
以上源码已经非常简单明了,如果你还是看不懂,或不会处理的话。你还是放弃学习VC++
展开全部
楼下回答应该还是不行,两个思路:
1.将CListBox窗口的句柄传入线程,线程中调用raw API对listbox的窗口进行处理
2.同样将句柄传入,线程中用SendMessage或者Postmessage 进行通信(例如WM_COPYDATA) 在主线程中拦截这个消息,并取出数据进行处理
3.在进程空间中设置一个内存映射文件,并建立一个事件对象EVENT,线程处理后的结果放入内存映射文件中后,设置event,主线程去内存映射文件中去读数据
4.用管道通信
5.用socket通信
6.用event加全局缓冲区char buf[500]通信并同步。
7.线程将结果写入硬盘文件,主线程去文件中读信息
1.将CListBox窗口的句柄传入线程,线程中调用raw API对listbox的窗口进行处理
2.同样将句柄传入,线程中用SendMessage或者Postmessage 进行通信(例如WM_COPYDATA) 在主线程中拦截这个消息,并取出数据进行处理
3.在进程空间中设置一个内存映射文件,并建立一个事件对象EVENT,线程处理后的结果放入内存映射文件中后,设置event,主线程去内存映射文件中去读数据
4.用管道通信
5.用socket通信
6.用event加全局缓冲区char buf[500]通信并同步。
7.线程将结果写入硬盘文件,主线程去文件中读信息
追问
举个例子吧:
在按钮Begin中创建线程FO,在线程B中将变量pages的值输出到对话框中的ID为IDC_LIST1的CListBox中。
代码怎么写?只要写按钮和线程函数就可以。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询