žžž 代码结构调整,请经验丰富的高手指点迷津。题目较长,过客就不必耽误这个时间了 žžž

沈阳人 2002-05-21 08:58:37
SDI---FORMVIEW结构的程序

原有的结构如下描述:

CxView::fun1()
{
a = 9 ;//CxView成员变量
...
doc_in_CxView->hello = 100 ; //DOC类的成员变量
...
fun2();//CxView成员函数
...
fun3();//CxView成员函数
...
}
CxView::fun2()
{
...
}
CxView::fun3()
{
...
}

现在希望把fun1()作为一个单独的线程来调用,使用AfxBeginThread()来启动fun1(),把CxView的当前对象指针作为参数传送进去,如下:
AfxBeginThread(fun1,(LPVOID)this);
对fun1()函数做如下转换:
UINT CxView::fun1(LPVOID k)
{
CxView * view_in_thread = (CxView *)k ;
k->a = 9;
...
k->fun2();
...
k->fun3();
...
}

这种调整方式对不对?为什么调整后编译通过,在运行的时候却出现了异常,是在MFC中的ASSERT报的错误。怎么回事?
请经验丰富的高手指点迷津。
...全文
460 17 打赏 收藏 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
guopo 2002-05-24
  • 打赏
  • 举报
回复
我的意思是说你在CMyDoc类中new CMsg;
又在CMsg中new CMyDoc,这样调用构造函数可能不行。
doc_in_msg 和 msg_in_doc不是同一个doc和同一个msg吗?

沈阳人 2002-05-24
  • 打赏
  • 举报
回复
类中存在相互的指针

是什么意思啊?
没有明白指的是什么?
沈阳人 2002-05-24
  • 打赏
  • 举报
回复
由于类中存在相互的指针

指的是什么相互的指针啊?没有明白
沈阳人 2002-05-23
  • 打赏
  • 举报
回复
zijiupyixia
沈阳人 2002-05-23
  • 打赏
  • 举报
回复
我的程序是SDI+FORMVIEW模式的。
主要有一下几个类:
Cmysocket::CSocket;
CMsg::CObject;
Cmyview::Cformview;
CmyDoc::CDocument;
-------------------------------
CmyDoc中有以下主要的成员变量:
Cmysocket * mysocket;
CArchive * ar_in;
CArchive * ar_out;
CSocketFile * mysocketfile;
char sendinfo[512] ;
CMsg * msg_in_doc ;
BYTE current_status ;

在创建一个新的文档的时候,即OnNewDocument()的时候建立了与SERVER的连接。
现在的主要工作是在Cmyview中进行线程的代码结构调整,原来在Cmyview中的代码结构关系是:

Cmyview::OnButtonBegin()
{
...
fun1();
...
}

Cmyview::fun1()
{
dco_in_myview->current_status = 12 ;
//doc_in_myview是在视图开始的时候通过GetDocument()得到的
for ( int i =0 ; i < 512 ; i ++)
doc_in_myview->sendinfo[i] = 66;
doc_in_myview->msg_in_doc->send_to_server();
m_listbox.AddString ("send ok !");
}

其中的send_to_server定义如下:

CMsg::send_to_server()
{
doc_in_msg->ar_out->Write(doc_in_msg->sendinfo,512);
doc_in_msg->ar_out->Flush();
}
//其中的doc_in_msg是在CMsg的构造函数时把doc的指针传送进去的。

现在希望做的代码调整,就是把在OnButtonBegin的时候重新开始一个线程。

调整过程中对Cmyview::fun1()、Cmyview::OnButtonBegin()两个函数进行修改
Cmyview::OnButtonBegin()
{
...
AfxBeginThread(fun1,(LPVOID)this);
...
}

UINT Cmyview::fun1(LPVOID k) //声明的时候加上static
{
Cmyview * view_in_thread ;
view_in_thread = (Cmyview * )k;
view_in_thread ->dco_in_myview->current_status = 12 ;
//doc_in_myview是在视图开始的时候通过GetDocument()得到的
for ( int i =0 ; i < 512 ; i ++)
view_in_thread->doc_in_myview->sendinfo[i] = 66;
view_in_thread->doc_in_myview->msg_in_doc->send_to_server();
view_in_thread->m_listbox.AddString ("send ok !");
}

其余的函数都没有变动。

现在存在的问题就是在代码调整之后
doc_in_msg->ar_out->Write(doc_in_msg->sendinfo,512); 出现异常!
跟踪进去就是SOCKECORE.CPP的566行在ASSERT的时候异常了。
willpufo 2002-05-23
  • 打赏
  • 举报
回复
关注
guopo 2002-05-23
  • 打赏
  • 举报
回复
2。这些你在什么地方定义的?
CMySocket* mySocket;
CSocketFile* mySocketFile;
CArchive* ar_in;
CArchive* ar_out;
mySocketFile=new CSocketFile(mySocket,TRUE);
ar_in=new Archive(mySocketFile,CArchive::load);
ar_out=new Archive(mySocketFile,CArchive::store);
1。
CMsg::send_to_server()
{
doc_in_msg->ar_out->Write(doc_in_msg->sendinfo,512);
doc_in_msg->ar_out->Flush();
}
//其中的doc_in_msg是在CMsg的构造函数时把doc的指针传送进去的。
你是怎么将doc指针传进去的呢?能否将这函数给Doc类。

3。最好在线程内部得到CDoc指针。

可能原因:
ar_out没有关连上文件。由于类中存在相互的指针。
guopo 2002-05-22
  • 打赏
  • 举报
回复
OH.SORRY.
AfxBeginThread(fun,(LPVOID)this);

UINT fun(LPVOID k)
{
CxView * view_in_thread = (CxView *)k ;
view_in_thread->fun1();
}
I WILL TRY MYSELF,WAIT FOR MY RESULT!
guopo 2002-05-22
  • 打赏
  • 举报
回复
可不可以这样试一下:
AfxBeginThread(fun,(LPVOID)this);

UINT fun(LPVOID k)
{
CxView * view_in_thread = (CxView *)k ;
view_in_thread->fun1();
view_in_thread->a = 9;
...
view_in_thread->fun2();
...
view_in_thread->fun3();
...
}
improgrammer 2002-05-22
  • 打赏
  • 举报
回复
可能是多个线程并发访问对象成员(如k->a=9;)造成的。请仔细分析。
解决办法:用Mutex等机制实现互斥访问,同时小心避免死锁问题。
guopo 2002-05-22
  • 打赏
  • 举报
回复
检查是否CSocket对象已经关闭。
你把代码贴出来吧。
沈阳人 2002-05-22
  • 打赏
  • 举报
回复
我跟踪进去是在
SOCKCORE.CPP:
void CAsyncSocket::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_hSocket == INVALID_SOCKET || CAsyncSocket::FromHandle(m_hSocket) != NULL);///**********
}
星号的语句出现问题
我原来的程序在DOC类中定义了一个CSOSKET的成员变量
程序启动后与SERVER建立一个TCP连接
现在我开了另一个线程,同样想使用这个CSOCKET的连接
ASSERT就出现了问题
是不是不允许使用同一个SOCKET连接?!
沈阳人 2002-05-22
  • 打赏
  • 举报
回复
跟踪来看,SOCKET并没有关闭
是在CAsyncSocket::FromHandle()的时候出现的问题
查了MSDN,解释说是SOCKET句柄没有关联CAsyncSocket对象

代码好长,而且结构挺乱的,我把有用的捡出来,然后再贴出来。
guopo 2002-05-22
  • 打赏
  • 举报
回复
this is what i do,i see no wrong in my computer.

CxView::fun1()
{
a = 9 ;//CxView成员变量
...
GetDocument()->hello = 100 ; //DOC类的成员变量
...
fun2();//CxView成员函数
...
fun3();//CxView成员函数
...
}

AfxBeginThread(fun,(LPVOID)this);

UINT fun(LPVOID k)
{
CxView * view_in_thread = (CxView *)k ;
view_in_thread->fun1();
}

沈阳人 2002-05-21
  • 打赏
  • 举报
回复
up by myself
沈阳人 2002-05-21
  • 打赏
  • 举报
回复
定义的时候已经定义成STATIC的了
便宜可以通过
就是运行的时候在SOCKCORE。CPP中的566行出现错误
是ASSERT检测出来的
webber84 2002-05-21
  • 打赏
  • 举报
回复
编译能通过?fun1应该定义成static的.
内容概要:本文围绕“数据驱动下光伏建筑群源荷不确定性解析及其储能多目标低碳经济调度研究”展开,提出了一种融合数据驱动方法与多目标优化算法的综合调度框架。研究首先基于历史数据对光伏发电出力与建筑负荷的不确定性进行建模,采用概率预测与场景生成技术刻画源荷波动特性,并通过典型场景提取降低输入复杂性。在此基础上,构建了以最小化系统运行成本、降低碳排放强度、提升可再生能源消纳率为目标的多目标优化模型,引入NSGA-II等先进智能优化算法求解Pareto最优前沿,实现经济性与低碳性的协同优化。通过Python编程完成模型搭建与仿真验证,结果表明该方法能有效应对源荷双重不确定性,在保障供电可靠性的前提下,实现了储能系统的优化配置与多目标调度决策的均衡协调; 适合人群:具备一定电力系统基础知识和Python编程能力,从事能源系统优化、智能调度、低碳技术等相关领域的研究生、科研人员及工程技术人员; 使用场景及目标:①应用于光伏建筑群、工业园区微电网等分布式能源系统的运行调度;②支撑含储能系统的多目标低碳经济调度决策,兼顾能源成本节约与碳排放控制双重目标;③为相关课题的研究与工程实践提供完整的算法实现参考与可复现的仿真案例支持; 阅读建议:建议读者结合文中提供的Python代码深入理解模型构建与求解流程,重点关注不确定性建模与多目标优化的耦合机制,可在实际数据基础上复现并改进算法,进一步探索不同权重策略下的调度方案优选方法。
代码下载链接: https://pan.quark.cn/s/cd4149768c91 互联网灰度部署系统解决方案的核心内容深度阐释: 一、灰度发布概念 灰度发布(亦称金丝雀发布)是在云计算及互联网服务领域中常见的一种发布策略,其中心理念是在全面推广新版本前,先向部分用户群体开放试用,以此来降低更新过程中的潜在风险。这种发布模式能够有效地兼顾用户体验与系统稳定性,它允许企业逐步将新的代码或功能部署至生产环境,并且仅对部分用户群体可见。此种做法有助于提前识别潜在问题,对用户体验造成的影响较小,并且能够获取更为真实的用户反馈信息。 二、系统现状和建设背景 在传统的发布模式中,每次更新都需要暂停服务才能发布新版本,这在用户体验和服务连续性方面存在明显不足。伴随互联网经济的繁荣发展,移动终端与日常生活的融合日益紧密,对互联网系统的支撑需求持续增长。特别是在电信行业,系统需要实现7*24小时不间断服务,以适应快速变化的市场需求和频繁更新的技术。因此,迫切需要一种新的发布方式,即灰度发布,用以提升产品发布的效率并改善用户体验。 三、灰度发布的优势与挑战 灰度发布相较于传统全量发布的优势包括: 1. 提供了新功能的试错空间,支持边发布边进行优化。 2. 维持服务的连续性,实现无缝升级。 3. 针对不同用户群体实施功能区分,提升用户体验和满意度。 4. 收集用户反馈,为后续版本的功能迭代和优化提供指导。 然而,灰度发布同样面临挑战,例如技术实现的复杂性、增加的运维压力等。 四、灰度发布的具体实施策略 1. 建设目标:保证湖北联通对外服务的互联网程序能够实现7*24小时不中断的灰度发布,实现无缝升级,同时全面提升用户体验。 2. 总体说明:需要通过灰度发布实现迭代开发和版本快速更...

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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