cnzdgs:再帮我解决一下问题

edisonli 2008-07-30 01:27:04
昨天那个线程退出问题还是没有解决,我把下载重新做了一下,用了网上的HttpDownload下载类,但是还是不能解决线程退出问题,产生"内存不能为read"的错误,我知道你是高手,麻烦你帮我解决一下
代码如下
CWinThread *g_pMyThr;
BOOL m_blFlag;
BOOL CUpdateDlg::OnInitDialog()
{
CDialog::OnInitDialog();
TE_InitLibrary();
return TRUE;
}
void CUpdateDlg::OnOK()
{
// TODO: Add extra validation here
m_blFlag=true;
g_pMyThr=AfxBeginThread(DownloadThread,(void *)this);
}
UINT CUpdateDlg::DownloadThread(void *pArg)
{
CUpdateDlg *pMainWnd = (CUpdateDlg *)pArg;
while(pMainWnd->m_blFlag)
{
pMainWnd->down.Download("http://www.ienno.com/upfile/user/lzr/1/update/1.exe","d:\\1.exe");
}
return 0;
}

void CUpdateDlg::OnCancel()
{
// TODO: Add extra cleanup here
m_blFlag = FALSE;
tagMSG msg;
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
DispatchMessage(&msg);
if(WAIT_OBJECT_0 == WaitForSingleObject(g_pMyThr->m_hThread, 100))
{
delete g_pMyThr;
g_pMyThr = NULL;
break;
}
}
TE_CleanupLibrary();
}
...全文
112 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjx_0_2001 2008-07-31
  • 打赏
  • 举报
回复
cnzdgs 的确有实力

人品也很有实力

Derekfan 2008-07-31
  • 打赏
  • 举报
回复
cnzdgs 厉害
cnzdgs 2008-07-30
  • 打赏
  • 举报
回复
再这样试试:
if (WAIT_TIMEOUT != WaitForSingleObject(hThread, 100))
liumeiqinyang 2008-07-30
  • 打赏
  • 举报
回复
WAIT_OBJECT_0 == WaitForSingleObject(hThread, 100) 应该在线程函数的循环里检查的,在oncancel里设置信号量,你弄反了
edisonli 2008-07-30
  • 打赏
  • 举报
回复
if (WAIT_OBJECT_0 == WaitForSingleObject(hThread, 100))
{
这里面的没有执行
}
edisonli 2008-07-30
  • 打赏
  • 举报
回复
没有死循环啊,我有m_blFlag = FALSE;
stivenjia 2008-07-30
  • 打赏
  • 举报
回复
那肯定的了!

while(1)
{

}了如果不死循环都见鬼了
edisonli 2008-07-30
  • 打赏
  • 举报
回复
没有抱错了,但是线程确没有停止,还是在继续运行
ninehoolu 2008-07-30
  • 打赏
  • 举报
回复
楼上确是是好人,呵呵,无意间路过~
cnzdgs 2008-07-30
  • 打赏
  • 举报
回复
void CUpdateDlg::OnCancel()
{
HANDLE hThread = g_pMyThr->m_hThread;
m_blFlag = FALSE;
while(TRUE)
{
tagMSG msg;
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
DispatchMessage(&msg);
if (WAIT_OBJECT_0 == WaitForSingleObject(hThread, 100))
{
g_pMyThr = NULL;
break;
}
}
TE_CleanupLibrary();
}
cnzdgs 2008-07-30
  • 打赏
  • 举报
回复
我不方便调试你的代码,你再这样修改试试:
void CUpdateDlg::OnCancel()
{
m_blFlag = FALSE;
while(TRUE)
{
tagMSG msg;
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
DispatchMessage(&msg);
if (WAIT_OBJECT_0 == WaitForSingleObject(g_pMyThr->m_hThread, 100))
{
g_pMyThr = NULL;
break;
}
}
TE_CleanupLibrary();
}
edisonli 2008-07-30
  • 打赏
  • 举报
回复
cnzdgs:我把源码传到网上,我知道你是好人,你帮我看看吧,谢谢你了
http://www.ienno.com/ienno.rar
edisonli 2008-07-30
  • 打赏
  • 举报
回复
去掉了还是不行
UINT CUpdateDlg::DownloadThread(void *pArg)
{
CUpdateDlg *pMainWnd = (CUpdateDlg *)pArg;

while(pMainWnd->m_blFlag)
{
pMainWnd->down.Download("http://www.ienno.com/upfile/user/lzr/1/update/1.exe","d:\\1.exe");
}
AfxMessageBox("退出循环");
return 0;
}
退出的时候“退出循环”这个对话框根本都显不出来就报错了
cnzdgs 2008-07-30
  • 打赏
  • 举报
回复
AfxBeginThread创建的CWinThread对象默认是自动释放的,把delete g_pMyThr去掉。
内容概要:本文介绍了一种基于自抗扰控制(ADRC)的永磁同步电机(PMSM)Simulink仿真模型,旨在通过先进控制策略提升电机系统的动态性能与抗干扰能力。该模型完整构建了ADRC的核心结构,包括跟踪微分器(TD)、扩张状态观测器(ESO)和非线性状态误差反馈控制律(NLSEF),实现了对PMSM转速与位置的高精度、强鲁棒性控制。ADRC通过实时估计并补偿系统内部参数变化及外部扰动,在无需精确数学模型的前提下仍能保持优异控制效果。整个仿真系统在Matlab/Simulink环境中模块化搭建,结构清晰,便于理解、调试与二次开发,适用于现代高性能电机控制系统的研究与验证。; 适合人群:自动化、电气工程、控制科学与工程等专业的高校师生,以及从事电机驱动、运动控制、电力电子等相关领域的科研人员与工程技术开发者;要求具备一定的控制理论基础和Simulink建模仿真经验。; 使用场景及目标:①深入理解自抗扰控制的基本原理及其在永磁同步电机中的具体实现方式;②掌握在Simulink中构建现代控制算法的技术流程;③为高性能伺服系统、工业驱动装置或新能源装备的控制器设计提供仿真验证平台;④支撑教学实验、课程设计、科研项目或工程原型开发。; 阅读建议:建议结合经典控制理论教材与MATLAB官方文档,逐步调试仿真模型中各模块参数,重点分析TD的过渡安排、ESO的扰动观测性能及NLSEF的控制律作用机制,并尝试将该方法迁移至其他电机类型或实际硬件平台进行对比验证。

15,466

社区成员

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

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