如何在线程的函数中调用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]); // 发信号通知监视线程本线程任 展开
但是我不会在线程函数中调用这个对话框的变量 直接调用会报错
一部分代码如下:
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]); // 发信号通知监视线程本线程任 展开
4个回答
展开全部
VC中推荐在work thread中不要操作界面,所以你最好重新构思你的程序
追问
我是按照实验要求一步步做的...前面的基本功能都已经实现完了...实验后面的思考题要求加个进度条 这个地方我卡住了...加不了...有什么方法么?
追答
在线程中更新进度条位置的数值 ProgressCount+=count; 然后发送一个消息给窗体,然后在窗体中接收到该消息后在设置进度条位置 m_progress.SetPos(ProgressCount);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
创建线程时将指针作为参数传入
AfxBeginThread(SendThread, this, NULL);
在线程函数中再强转使用
UINT CMainFrame::SendThread(LPVOID pParam)
{
CMainFrame *pThis = (CMainFrame*)pParam;
...
pThis->m_progress.SetPos(ProgressCount);
...
return 1;
}
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类的指针来调用并向下由函数参数一级一级传入。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
magicpapacy 正解
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询