如何在线程的函数中调用MFC对话框类的变量?

我做了一个多线程传输文件的对话框现在想要在对话框上添加一个进度条为进度条映射变量m_progress这就需要在传输一段文件后就更新m_progress的值使进度条前进也就... 我做了一个多线程传输文件的对话框 现在想要在对话框上添加一个进度条 为进度条映射变量m_progress这就需要在传输一段文件后就更新m_progress的值使进度条前进 也就是需要在线程函数SendThread(int idx)函数中用到m_progress
但是我不会在线程函数中调用这个对话框的变量 直接调用会报错
一部分代码如下:
void SendThread(int idx) // 传输文件数据的函数(搬运工人)
{
..............
while(LeftToRead>0)
{
ReadOnce=(LeftToRead>ReadSize)?ReadSize:LeftToRead;
count=file.ReadHuge(data,ReadOnce);
while((SOCKET_ERROR== sendSockets[idx-1].Send(data,count)))
{
}
ProgressCount+=count;
m_progress.SetPos(ProgressCount);//需要在这里调用变量 但不成功
LeftToRead=LeftToRead-count;
}
.................
}
我是初学者 希望能给一个比较详细的解决方法...谢谢
void SendThread(int idx) // 传输文件数据的函数(搬运工人)
{
CFile file;
char data[ReadSize];
long BeginPos, Size;
long FileLength;
long ReadOnce, LeftToRead, count;

if(!file.Open(fn[sendingseq],CFile::modeRead|CFile::shareDenyNone))
{
AfxMessageBox("读取文件错误!");
return;
}
FileLength=file.GetLength();
sendSockets[idx-1].Send(&FileLength, 4);
sendSockets[idx-1].Send(fn[sendingseq], 40);
// 获取本线程传输任务(传送块的大小和起始位置)
GetBeginPos(5 , idx, FileLength ,BeginPos, Size); //其中的5表示总共有5个线程,idx表示本线程编号
file.Seek(BeginPos, CFile::begin); //每个线程函数找到自己任务的起始点
LeftToRead=Size;
while(LeftToRead>0)
{
ReadOnce=(LeftToRead>ReadSize)?ReadSize:LeftToRead;
count=file.ReadHuge(data,ReadOnce);
while((SOCKET_ERROR== sendSockets[idx-1].Send(data,count)))
{
}
ProgressCount+=count;
LeftToRead=LeftToRead-count;
}
file.Close();
SetEvent(hsendEvent[idx-1]); // 发信号通知监视线程本线程任
展开
 我来答
百度网友e81bb48
2011-04-21 · 超过45用户采纳过TA的回答
知道小有建树答主
回答量:86
采纳率:0%
帮助的人:118万
展开全部
必须将对话框指针传入线程函数,其后有三种方式可以实现
方法一:中直接调用m_progress.SetPos(ProgressCount);
方法二:可以通过发送自定义消息,让对话框调用m_progress.SetPos(ProgressCount);
方法三:可以把具体实现放在类内部的成员函数(非静态)中,而在线程函数值用对话框指针调用这个函数,这样比较方便。
frwen_hbnu
2011-04-20 · 超过27用户采纳过TA的回答
知道答主
回答量:68
采纳率:0%
帮助的人:76.7万
展开全部
VC中推荐在work thread中不要操作界面,所以你最好重新构思你的程序
追问
我是按照实验要求一步步做的...前面的基本功能都已经实现完了...实验后面的思考题要求加个进度条 这个地方我卡住了...加不了...有什么方法么?
追答
在线程中更新进度条位置的数值 ProgressCount+=count;  然后发送一个消息给窗体,然后在窗体中接收到该消息后在设置进度条位置 m_progress.SetPos(ProgressCount);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友6b69700
推荐于2018-04-23 · TA获得超过411个赞
知道小有建树答主
回答量:200
采纳率:0%
帮助的人:201万
展开全部
创建线程时将指针作为参数传入
AfxBeginThread(SendThread, this, NULL);
在线程函数中再强转使用
UINT CMainFrame::SendThread(LPVOID pParam)
{
CMainFrame *pThis = (CMainFrame*)pParam;
...
pThis->m_progress.SetPos(ProgressCount);
...

return 1;
}
更多追问追答
追问
程序是这样的...
void CTest2Dlg::OnSend()
{
...
_beginthread(SendThreadFunction,0,(void *)i); //启动工头线程(由工头线程启动工人线程)
...
}
void SendThreadFunction(void * pParam)
{
int idx=(int)pParam;

SendThread(idx+1); // 启动工人线程
_endthread();
}
void SendThread(int idx) // 传输文件数据的函数(搬运工人)
{
...
}
追答
不知道你的i是什么,既然m_progress是CTest2Dlg的成员变量,就应该将CTest2Dlg类的指针传入,再用它调用m_progress,你的SendThread也是静态成员函数吧,这样写不是很好,它里面需要的变量也都要写成静态的了,同样也可以用CTest2Dlg类的指针来调用并向下由函数参数一级一级传入。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
clxye
2011-04-21 · 超过28用户采纳过TA的回答
知道答主
回答量:91
采纳率:0%
帮助的人:82.5万
展开全部
magicpapacy 正解
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式