点对点文件传输 postthreadmessage错误,帮帮忙

zxygegao 2008-12-21 09:29:10
我的设计思想是这样的,两个基于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;
...全文
103 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxygegao 2008-12-22
  • 打赏
  • 举报
回复
问题已解决 谢谢各位 尤其是那个 呵呵
zxygegao 2008-12-22
  • 打赏
  • 举报
回复
问题已解决 谢谢各位 尤其是那个 呵呵
zxygegao 2008-12-22
  • 打赏
  • 举报
回复
问题已解决 谢谢各位 尤其是那个 呵呵
cnzdgs 2008-12-22
  • 打赏
  • 举报
回复
出错时是在哪个类的哪个函数中?该函数是如何被调用的?
蒋晟 2008-12-22
  • 打赏
  • 举报
回复
answer是局部变量。不要传递局部变量的地址到作用域外
如果有必要,可以建立一个全局的缓存来保存answer的值,或者在answer退出作用域之前就在线程函数中把answer的值复制一份。
sys0007 2008-12-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zxygegao 的回复:]
恢复五楼的 有参数,WM_START其实就是WM_SENDFILE_SENDFILEBEGIN这个。你问的是这个意思吗
[/Quote]
我问有没有其他参数。wParam 和 lParam 是什么。
zxygegao 2008-12-21
  • 打赏
  • 举报
回复
恢复五楼的 有参数,WM_START其实就是WM_SENDFILE_SENDFILEBEGIN这个。你问的是这个意思吗
zxygegao 2008-12-21
  • 打赏
  • 举报
回复
四楼的 先确认一下出错时recvFile的值是否正常。这个怎么确认啊,不是太懂
zxygegao 2008-12-21
  • 打赏
  • 举报
回复
#define WM_RECEIVEFILE_RECEIVEBEGIN WM_USER+800//这是在recvfile的类中自定义的消息,其中recvfile是cwinthread的派生类。recvFile是recvfile类的对象

BEGIN_MESSAGE_MAP(CRecvFile, CWinThread)
//{{AFX_MSG_MAP(CRecvFile)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
ON_THREAD_MESSAGE(WM_RECEIVEFILE_RECEIVEBEGIN,startReceiveFile)

这是消息映射

LRESULT CRecvFile::startReceiveFile(WPARAM wParam, LPARAM lParam)
{。。。}//具体实现

下面是在主对话框中的实现函数
int ret=sendFile->PostThreadMessage(WM_SENDFILE_SENDFILEBEGIN,(WPARAM)answer.GetBuffer(answer.GetLength()),(LPARAM)answer.GetLength());

这个是在主对话框的initdialog初始化代码:
receFile =new CRecvFile(this);
int ret=receFile->CreateThread();
if (ret==0) {
AfxMessageBox("create recvfile thread failur");
}



好奇怪 我刚才回帖了,可是内容没了,真是奇怪
sys0007 2008-12-21
  • 打赏
  • 举报
回复
WM_START消息有参数没?
cnzdgs 2008-12-21
  • 打赏
  • 举报
回复
先确认一下出错时recvFile的值是否正常。
zxygegao 2008-12-21
  • 打赏
  • 举报
回复
是由cwinthread派生的类CRecvFile类的对象,在主dialog的BOOL CVedioChatDlg::OnInitDialog() 通过下面的语句
receFile =new CRecvFile(this);
int ret=receFile->CreateThread();
if (ret==0) {
AfxMessageBox("create recvfile thread failur");
}
创建的
WM_SENDFILE_SENDFILEBEGIN是我的自定义的消息,#define WM_RECEIVEFILE_RECEIVEBEGIN WM_USER+800

然后BEGIN_MESSAGE_MAP(CRecvFile, CWinThread)
//{{AFX_MSG_MAP(CRecvFile)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
ON_THREAD_MESSAGE(WM_RECEIVEFILE_RECEIVEBEGIN,startReceiveFile
)

这个是消息响应函数
LRESULT CRecvFile::startReceiveFile(WPARAM wParam, LPARAM lParam)
{。。。。}
zxygegao 2008-12-21
  • 打赏
  • 举报
回复
在initdialog中有值 但是出错的时候 展开this显示的cxx0030:error:expression cannot be evalated
cnzdgs 2008-12-21
  • 打赏
  • 举报
回复
出错时是不是recvFile指针无效?该指针是怎么来的?
cnzdgs 2008-12-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zxygegao 的回复:]
四楼的 先确认一下出错时recvFile的值是否正常。这个怎么确认啊,不是太懂
[/Quote]
调试程序,在receFile =new CRecvFile(this)之后查看一下receFile的值,在出错的时候再查看一次,看看receFile的值是否与前面相同。
zxygegao 2008-12-21
  • 打赏
  • 举报
回复
在主对话框的oninitdialog中
sendFile =new CSendFile(this);
ret=sendFile->CreateThread();
if (ret==0) {
AfxMessageBox("create sendfile thread failur");
}

其中CSendFile::CSendFile(CDialog *dialog)
{
pdlg=dialog;
}
这个是重载了的构造函数
sys0007 2008-12-21
  • 打赏
  • 举报
回复
怀疑你的sendFile在sendFile->PostThreadMessage前没赋值。


你的sendFile在哪里new的对象?
new是否成功了?
zxygegao 2008-12-21
  • 打赏
  • 举报
回复
没有人会吗?帮帮我把,在线等
zxygegao 2008-12-21
  • 打赏
  • 举报
回复
我试着new了 但是还是老样子 看一下我这样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
zxygegao 2008-12-21
  • 打赏
  • 举报
回复
你有没有qq或者msn啊 这样说话方便一下 我的qq 1042481793 msn xyzhang.xd@qq.com
加载更多回复(3)

15,471

社区成员

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

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