boost线程终止问题

tanghaitao4123 2011-06-22 11:25:02

// 执行查询操作的回调函数
void CCSFrame::DoQuery()
{
.....

// 申请数据库连接
CADODatabase* pDataBase = NULL;
m_pSysFrame->GetDatabase( &pDataBase);
.........

// 启动查询线程
boost::thread thread(boost::bind(&CCSFrame::QueryThread, this, cmd, pDataBase));
m_queryThread.swap(thread);
}

// 查询线程
void CCSFrame::QueryThread(CADOCommand& cmd, CADODatabase* pDataBase)
{
ASSERT( pDataBase);

USES_CONVERSION;

double dbValue;
CString szValue;
COleDateTime dtValue;
CADORecordset rs( pDataBase);
COleDateTime dtStart = COleDateTime::GetCurrentTime();
BOOL bResult = rs.Execute(&cmd, adUseServer);

//获取数据
...
rs.Close();
PostMessage(UM_QUERYCOMPLETE, 0, (LPARAM)pDataBase);
}

//窗口关闭
void CCSFrame::OnDestroy()
{
CFrameParent::OnDestroy();

// TODO: Add your message handler code here
m_queryThread.join();
}


代码大致就上面那样,开始查询数据,启动一个线程,由于数据量可能是上十万级别,所以BOOL bResult = rs.Execute(&cmd, adUseServer);可能会执行很久都没返回。这个时候关闭窗口,m_queryThread.join();要等线程返回才返回,这里又是个阻塞,就造成界面上的假死状态。
各位大大,要怎么终止这个线程,并保证数据库连接(pDataBase)、结果集(CADORecordset rs( pDataBase))、线程本身的资源能正确释放??
...全文
433 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lchlovely 2012-05-25
  • 打赏
  • 举报
回复
用time_jion
tanghaitao4123 2011-06-24
  • 打赏
  • 举报
回复
问题还是没能解决,弹警告框的想法不是没有,但是客户就是要求必须要能关闭,不等待。
不管怎样,还是谢谢各位的意见,,,暂时先不结贴,看看还有没人能帮忙吧,,,到时候分再给各位。。。
morebread 2011-06-23
  • 打赏
  • 举报
回复
LS你发的东西和LZ要问的东西不是同一个事情好吧
smilestone322 2011-06-23
  • 打赏
  • 举报
回复
如何结束线程:
http://blog.csdn.net/smilestone322/archive/2011/06/19/6555039.aspx

如何终止线程:
http://blog.csdn.net/smilestone322/archive/2011/06/18/6554140.aspx
kyotrue 2011-06-22
  • 打赏
  • 举报
回复
如果你的rs.Execute只能以同步阻塞的方式执行,那就只有等它执行了。

你唯一能想办法的地方,就是看CADORecordset有没有异步方式的Execute,可以Cancel的。
tanghaitao4123 2011-06-22
  • 打赏
  • 举报
回复
queryThread一直阻塞在BOOL bResult = rs.Execute(&cmd, adUseServer);
他能收到消息并处理?
kyotrue 2011-06-22
  • 打赏
  • 举报
回复
给你的queryThread线程发个消息,让它收到这个消息时立即结束当前操作
oyljerry 2011-06-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tanghaitao4123 的回复:]
queryThread一直阻塞在BOOL bResult = rs.Execute(&cmd, adUseServer);
他能收到消息并处理?
[/Quote]
如果rs.Execute(&cmd, adUseServer);
是阻塞,没办法返回,那么就从程序UI界面来控制,可以谈一个警告对话框,说:用户操作进行中,当前不能关闭。请等待.
C++内存泄漏检测原理+实例源码下载,是一个跨平台的C++ 内存泄漏检测器的源程序,一个主要缺陷是不支持多线程。分配内存时不进行文件名复制,而只是保存其指针;效率较高(编译debug_new.cpp  时有效;参见文件中的注释)   我本人认为,debug_new目前的一个主要缺陷是不支持多线程。对于某一特定平台,要加入多线程支持并不困难,难就难在通用上(当然,条件编译是一个办法,虽然不够优雅)。   等到C++标准中包含线程模型时,这个问题也许能比较完美地解决吧。另一个办法是使用像boost这样的程序库中的线程封装类,不过,这又会增加对其它库的依赖性--毕竟boost并不是C++标准的一部分。如果项目本身并不用boost,单为了这一个目的使用另外一个程序库似乎并不值得。因此,我自己暂时就不做这进一步的改进了。   另外一个可能的修改是保留标准operator new的异常行为,使其在内存不足的情况下抛出异常(普通情况)或是返回NULL(nothrow情况),而不是像现在一样终止程序运行(参见debug_new.cpp 的源代码)。这一做法的难度主要在于后者:我没想出什么方法,可以保留 new(nothrow) 的语法,同时能够报告文件名和行号,并且还能够使用普通的new。不过,如果不使用标准语法,一律使用debug_new和debug_new_nothrow的话,那还是非常容易实现的。

15,471

社区成员

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

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