PostThreadMessage access violation点对点文件传输,大家帮帮忙啊

zxygegao 2008-12-20 11:54:11
我的设计思想是这样的,两个基于CWinThread的thread的对象 sendfile,recvfile。三个基于CSocket的socket的对象,dfilecontrolsend、dfielcontrolrecv和dfile,
做的是点对点的文件传输。实现的流程是这样的

1.sendfile->postthreadmessage(WM_START)
2.然后在sendfile类中响应WM_START消息的函数内调用dfilecontrolsend.sendfilecontrolSend(这里发送的是要发送的文件的信息),
3.socket类中的sendfilecontrolsend中sendto(要发送的文件的信息,remoteaddress)
4.在onreceive中判断是这个消息后,通过执行主对话框中的函数recvfile来确定是否要接收文件,是的话,recvfile->postthreadmessage(WM_STARTsend),
5.然后在recvfile类中的响应WM_STARTsend的函数中调用dfilecontrolrecv发送对方同意接收文件的信息。

但是现在的问题是执行第四步的时候,报错,错误是access violation,指向的错误代码是recvfile->postthreadmessage(WM_STARTsend),如何解决?
前几步都是符合我设计的想法的。帮帮忙啊
这是出错的代码

CString title="文件"+str+" 是否接受?";
CString answer;
if(IDYES == AfxMessageBox(title,MB_YESNO|MB_DEFBUTTON1))
{
//dfileControlSend.CloseSocket();
answer="接受";
}
else
{
AfxMessageBox("OnRecvfilebegin(CString str) reject");
answer="拒绝";
return -1;
}
int ret=recvFile->PostThreadMessage(WM_SENDFILE_SENDFILEBEGIN,(WPARAM)answer.GetBuffer(answer.GetLength()),(LPARAM)answer.GetLength()); answer.ReleaseBuffer();
if (ret==-1) {
AfxMessageBox("向 sendfile回复进程发送 是否同意接收文件的请求错误");
return -1;
}
else{
m_recvFileStart=TRUE;
return 0;
...全文
97 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
蜜_Lumia 2010-02-21
  • 打赏
  • 举报
回复
在wm中文件上传 具体是怎么弄的啊 能把代码发给我一下吗 我的邮箱是xiongyongchen34@163.com 谢谢
zxygegao 2008-12-22
  • 打赏
  • 举报
回复
问题已解决 谢谢各位
zxygegao 2008-12-21
  • 打赏
  • 举报
回复
new的也不可以啊 我是这样弄的 你看下对不对
char* buffer = new char [100];
if(IDYES == AfxMessageBox(title,MB_YESNO|MB_DEFBUTTON1))
{
//dfileControlSend.CloseSocket();
answer="接受";


}
else
{
AfxMessageBox("OnRecvfilebegin(CString str) reject");
answer="拒绝";
return -1;
}
AfxMessageBox(answer);
//int n=answer.GetLength();
//strcpy(buffer,answer);

int ret=sendFile->PostThreadMessage(WM_SENDFILE_SENDFILEBEGIN,(WPARAM)buffer,(LPARAM)n);

但是不幸的是还是access violation 了 不是这样应该怎么弄呢
wap21 2008-12-21
  • 打赏
  • 举报
回复
友情up
hpig 2008-12-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zxygegao 的回复:]
全局的不可以 还是一样的错误
[/Quote]

你认为是全局的就好了?

哪个buffer 在CString 内部都被释放,然后重新分配了!

answer这个对象的地址不变! 但是内部的buffer在变!
hpig 2008-12-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sys0007 的回复:]
引用 7 楼 zxygegao 的回复:
还是老样子 是不是线程之间传递参数的问题啊 ,但是sendfile那个也是这样的 ,可是是成功的 为什么这里不行呢 调试信息 就是那个answer是可以输出的,就是后面的那句就不行了


因为answer.ReleaseBuffer(); 那块内存在另一个线程使用呢,你是否就会有问题啦。
你可以通过new一个内存把指针传过去,在另一个线程里接收到后由接收者释放内存就不会有问题了。
[/Quote]

支持!
post系列都是异步的
等另外哪个thrad处理的时候, wParam 都不知道指的是那里了!你的程序当然是显示access violation
zxygegao 2008-12-21
  • 打赏
  • 举报
回复
全局的不可以 还是一样的错误
zxygegao 2008-12-21
  • 打赏
  • 举报
回复
不过我感觉不是那里的问题,因为我前边那样做过,而且是对的,我觉得这里这样实现没什么问题的
就是上面说的第一步
1.sendfile->postthreadmessage(WM_START)
这个就实现了 ,也没什么问题
zxygegao 2008-12-21
  • 打赏
  • 举报
回复
我试试
zxygegao 2008-12-21
  • 打赏
  • 举报
回复
我看下 谢谢
sealy_2007 2008-12-21
  • 打赏
  • 举报
回复
最好把处理buffer代码贴出来,问题应该是这样:
answer的生命期很明显是在你这个函数结束时结束;
你把这个answer对象的内存传到另外一个线程去了,这个是跨线程传递内存的大忌
一旦你的函数调用结束,你传出去的内存就变成了野指针;

8楼说的很对,一定要new,但不会是releasebuffer的问题,它只是释放掉多余的内存;

另外answer.GetBuffer(answer.GetLength()),这种做法有点多余,可以直接写answer.GetBuffer()
releasebuffer也可以不用调
zxygegao 2008-12-20
  • 打赏
  • 举报
回复
mark是什么意思?
qqlpp 2008-12-20
  • 打赏
  • 举报
回复
mark
zxygegao 2008-12-20
  • 打赏
  • 举报
回复
希望大家能帮帮我 谢谢
sys0007 2008-12-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zxygegao 的回复:]
还是老样子 是不是线程之间传递参数的问题啊 ,但是sendfile那个也是这样的 ,可是是成功的 为什么这里不行呢 调试信息 就是那个answer是可以输出的,就是后面的那句就不行了
[/Quote]

因为answer.ReleaseBuffer(); 那块内存在另一个线程使用呢,你是否就会有问题啦。
你可以通过new一个内存把指针传过去,在另一个线程里接收到后由接收者释放内存就不会有问题了。
zxygegao 2008-12-20
  • 打赏
  • 举报
回复
还是老样子 是不是线程之间传递参数的问题啊 ,但是sendfile那个也是这样的 ,可是是成功的 为什么这里不行呢 调试信息 就是那个answer是可以输出的,就是后面的那句就不行了
sys0007 2008-12-20
  • 打赏
  • 举报
回复
CString answer;是局部变量。
把设置为全局或成员变量试试。
因为PostThreadMessage是异步的,可能是内存被释放了。。
zxygegao 2008-12-20
  • 打赏
  • 举报
回复
recvfile是一个线程
在initdialog中创建的,
receFile =new CRecvFile(this);//////CRecvFile是基于winthread的类,在此类的实现中重载了构造函数
int ret=receFile->CreateThread();

不知道是不是你想问的
瓶盒 2008-12-20
  • 打赏
  • 举报
回复
recvFile变量是否有值?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧