如果可以分成小段时间的操作,那自然是很好办了,问题是这个操作不能分开:(
等的方法倒也有用的,NAV的那个LiveUpdate就是这么搞的,我点了中止都要等好半天,但我不喜欢这种效果
等的方法倒也有用的,NAV的那个LiveUpdate就是这么搞的,我点了中止都要等好半天,但我不喜欢这种效果
解决方案 »
- 关于在SQL语句中调用DLL
- 关于CMarkup ,xml
- 在OnPrepareDC()种设置映射模式后为什么在窗口滚动时图形模糊
- C盘备份问题
- 急急:(各位高手,麻烦你了)视图从CRichEditView继承。现在我添加了一个CListBox列表框,希望在选择一个 列表框里面的选项的时候,取得
- 各位 大虾 我的程序不能快速退出 是什么原因呢
- 请问为何要在两处维护guid? com技术内幕 例子的一个简单问题
- 怎样才能将edit控件中的内容付给一个字符串变量?
- 第一次用socket编程,得不到结果啊。。
- 窗口分割,子窗口选择性隐藏问题,CSplitterWnd
- WINDOWS 网络编程技术问题?向高手请教!
- 如何屏蔽系统热建?
引入Event当然可以保证资源的释放,但是如果线程需要比较长时间执行完的话(比如里面调用了一个函数,而这个函数需要很长时间),可能会有比较长时间的延时,我的意思就是说立即结束这个线程,同时保证线程所占用资源的正常释放。
但是我为什么这么爱用....因为我懒
在这种情况下,是否要考虑 用工作者线程 是否合理的问题.
如果实现一个 类似COM里面的那种 报文队列线程,PostQuitMessage是否可以实现----具体我有些忘了,好象也是要等消息队列处理到该消息才退出,如果是这样的话,也不能满足要求.我还是听听吧.
再作为参数传给线程,这样不就爱什么时候杀就什么时候杀了嘛,杀完了再释放相应资源。
我一般是这样干的。不过好久没有写vc多线程程序,一下没有想起来。
我想能不能让线程函数在需要的时候停止正在处理的数据,直接跳到结尾处。简直废话:(
我想能不能让线程函数在需要的时候停止正在处理的数据,直接跳到结尾处。简直废话:(
但问题是如果线程调用的函数中要用到C++对象呢?
调用它的释放函数。比如
Struct _A
{
//Define C++ Obj here
C++Obj Obj;
}A//main class
A m_A;
m_A.Obj.Create;
AfxBeginThread(...&m_A);//In thread use m_A //in Main Class
TerminateThread
m_A.Obj.Release;
另外,看到AfxBeginThread,我又想起一件事。开始我的程序就是用AfxBeginThread,但发现用这个东西有些问题,当线程正在执行时,退出程序,在退出程序前,我用TerminateThread中断线程,但程序结束后,我发现居然有一个CWinThread对象泄漏了。不用AfxBeginThread,改成_beginthreadex就可以了。
你应该用一个变量把这个指针储存以待释放。这个问题的解决方案就是:如果你真的很在乎线程里资源泄露的问题,而不能保证,
那么,你就不要在线程以及线程范围的代码里申请其他地方无法释放的资源。
TerminateThread的主要缺点有:
1,线程栈不会被释放。因为这时可能有别的线程正在访问栈里的内容,TerminateThread如果把栈释放,会引起
访问冲突。当然这个栈在程序结束时会被释放掉。这是所谓的资源泄漏。
2,有些DLL需要处理DLL_THREAD_DETACH事件(例如MSVCRT40.DLL,VC的C运行时库),而TerminateThread不会发送这一事件,这会造成一些问题。
3,可能引起程序死锁。试想,如果线程在调用EnterCriticalSection后被Terminate了,这就可能会挂起其他线程。Jeffrey的方法可以解决前两个问题。他的基本思路是让目标线程产生一个异常,通过异常展开,系统会为所有局部C++对象调用析构函数,然后退出线程,
由于是线程自己退出,线程栈会被释放,所有DLL也会收到DLL_THREAD_DETACH通知。但是无法解决潜在的死锁问题。
让目标线程产生一个异常很简单,只要用GetThreadContext然后SetThreadContext
把eip改到自己的一段代码,然后调用RaiseException即可。
白菜你可以多看看msdn网站上Jeffrey 的文章(好象可以搜索到)。这个路子我看过的。
但是没有singlerace理解翻译的清楚,也没有实验过。
多加一些同步代码,每隔一段时间就判断一下是否退出,并附上清理代码。
TerminateThread不是好办法,但是最有效的也是唯一的。