📄 c++ builder 高手进阶 (五)用bcb编写多线程应用程序.htm
字号:
<FONT color=#ff0066>[组图]</FONT> <A title=Google徽标全集(1998-2005)
href="http://www.malegebide.com/article/5/12/2006/200608311488.html">Google徽标全..</A><BR>·
<FONT color=#0066ff>[图文]</FONT> <A title=有趣的Google新鲜技巧玩法
href="http://www.malegebide.com/article/5/11/2006/200608301352.html">有趣的Google..</A><BR>·
<A title=Google排名—搜索引擎登记技巧
href="http://www.malegebide.com/article/5/11/2006/200608301360.html">Google排名—搜索引..</A><BR>·
<FONT color=#0066ff>[图文]</FONT> <A title=菜鸟安全防患之饿死木马
href="http://www.malegebide.com/article/10/2006/200608291188.html">菜鸟安全防患..</A><BR>·
<A title=数学最大数字
href="http://www.malegebide.com/article/9/2006/20060827361.html">数学最大数字</A><BR>·
<A title=Google搜索技巧(6):用Google找自己
href="http://www.malegebide.com/article/10/2006/200608291195.html">Google搜索技巧(6):..</A><BR></TD></TR>
<TR>
<TD bgColor=#ffffff height=2></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=titleback1>相关文章</TD></TR>
<TR>
<TD vAlign=top height=100>· <A title="《c++ primer》读书笔记4"
href="http://www.malegebide.com/article/1/14/2006/2006092518481.html">《c++
primer》读书..</A><BR>· <A title="《c++ primer》读书笔记6"
href="http://www.malegebide.com/article/1/14/2006/2006092518480.html">《c++
primer》读书..</A><BR>· <A title="一个有意思的C++ trick (2)"
href="http://www.malegebide.com/article/1/14/2006/2006092518477.html">一个有意思的C++
tr..</A><BR>· <A title="《c++ primer》读书笔记3"
href="http://www.malegebide.com/article/1/14/2006/2006092518473.html">《c++
primer》读书..</A><BR>· <A title="《c++ primer》读书笔记5"
href="http://www.malegebide.com/article/1/14/2006/2006092518472.html">《c++
primer》读书..</A><BR>· <A title="如何在C++ Builder的DLL中使用数据库控件"
href="http://www.malegebide.com/article/1/14/2006/2006092518470.html">如何在C++
Builder的..</A><BR>· <A title="Python 与 C++ 程序的简单实例对比"
href="http://www.malegebide.com/article/1/14/2006/2006092518469.html">Python
与 C++ 程序..</A><BR>· <A title="Visual C++ MFC 一文说尽 (推荐)(很长,没耐心就不要看了)"
href="http://www.malegebide.com/article/1/14/2006/2006092518468.html">Visual
C++ MFC 一文..</A><BR>· <A title="VC++ Members Weblog"
href="http://www.malegebide.com/article/1/14/2006/2006092518466.html">VC++
Members Weblo..</A><BR>· <A title="C++ Builder和托管C++中属性的使用建议"
href="http://www.malegebide.com/article/1/14/2006/2006092518459.html">C++
Builder和托管C..</A><BR></TD></TR></TBODY></TABLE></TD>
<TD class=tableright align=right width=588>
<TABLE style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellSpacing=0
cellPadding=0 width=575 border=0>
<TBODY>
<TR>
<TD style="FONT-SIZE: 12pt; COLOR: #ff6600" align=middle
height=32>C++ Builder 高手进阶 (五)用BCB编写多线程应用程序</TD></TR>
<TR>
<TD align=middle bgColor=#f7f7f7
height=25>作者:佚名 来源:不详 发布时间:25/09/2006
19:11:38 发布人:admin</TD></TR>
<SCRIPT language=javascript>
var newasp_fontsize=9;
var newasp_lineheight=12;
</SCRIPT>
<TR>
<TD>
<P align=right><A title=减小字体
style="CURSOR: hand; POSITION: relative"
onclick='if(newasp_fontsize>8){NewaspContentLabel.style.fontSize=(--newasp_fontsize)+"pt";NewaspContentLabel.style.lineHeight=(--newasp_lineheight)+"pt";}'><IMG
height=15 src="C++ Builder 高手进阶 (五)用BCB编写多线程应用程序.files/1.gif"
width=15 border=0><FONT color=#ff6600>减小字体</FONT></A> <A title=增大字体
style="CURSOR: hand; POSITION: relative"
onclick='if(newasp_fontsize<64){NewaspContentLabel.style.fontSize=(++newasp_fontsize)+"pt";NewaspContentLabel.style.lineHeight=(++newasp_lineheight)+"pt";}'><IMG
height=15 src="C++ Builder 高手进阶 (五)用BCB编写多线程应用程序.files/2.gif"
width=15 border=0><FONT color=#ff6600>增大字体</FONT></A> </P>
<DIV class=ContentFont id=NewaspContentLabel
style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px"><FONT
id=font_word
style="FONT-SIZE: 14px; FONT-FAMILY: 宋体, Verdana, Arial, Helvetica, sans-serif">
<P align=center><B>C++ Builder 高手进阶</B></P>
<P align=center><B>(五)用BCB编写多线程应用程序</B></P>
<P align=center><A
href="mailto:nxyc_twz@163.com">nxyc_twz@163.com</A></P>
<P align=left><A href="mailto:nxyc_twz@163.com"><BR></A> <BR> 随着<A
class=wordstyle href="http://www.malegebide.com/"
target=_blank>Windows</A>系统的全球性普及,多线程技术已越来越多地运用到许多软件设计中。使用多线程技术可全面提高应用程序的执行效率。以前为了实现多线程编程,<SPAN
id=tghslkjhcavmiimg>GI.S(业Rlx件mw|un@</SPAN>基本上都是调用一系列的API函数,如CreateThread、ResumeThread等,不容易控制,还容易出错。在使用BCB以后,我才发现原来编写多线程程序也可以如此简单!BCB为我们提供了强大的TThread类,从而使得多线程编程变得非常简便易用。下面请跟我一起开始我们的BCB多线程编程之旅。<BR><U> 1.
创建多线程程序:<BR></U> 首先,我介绍一下BCB中编写多线程程序的具体步骤。<BR> 在C++Builder
IDE环境下选择菜单File|New,
<P id=ftvwufugklppdpaunb>?j9h}中X供ZjO;Se育1zJ</P>在New栏中选中Thread
Object,<SPAN
id=sbhasqugibsmlfsnuc>I教W[w+8V"e#.yx1'84</SPAN>按OK,接下来弹出输入框,输入TThread对象子类的名字NewThread,这样C++Builder自动为你创建了一个名为TNewThread的TThread子类。下面是TNewThread的部分源码:<BR> __fastcall
NewThread::MyThread(bool CreateSuspended)<BR> :
TThread(CreateSuspended)<BR> {//构造函数,可用来初始化一些信息<BR> }<BR> void
__fastcall NewThread::Execute()<BR> {<BR>
//多线程程序的核心,用来执行相关多线程操作<BR> }
<P></P>
<P align=left>
BCB中的Execute()函数是我们要在线程中实现的任务代码所在地。使用多线程时,动态创建一个TNewThread
对象,在构造函数中使用Resume()方法,具体执行的代码使用Execute()方法重载的代码。如果想创建更多的线程,只需要创建需要数量的TNewThread
而已。<BR> 通过以上步骤我们基本实现了在程序中如何创建一个线程,并使程序实现了多线程应用。但是,多线程应用的实现,并不是一件简单的工作,还需要考虑很多使多个线程能在系统中共存、互不影响的因素。比如,程序中公共变量的访问、资源的分配,如果处理不当,不仅线程会死锁陷入混乱,甚至可能会造成系统崩溃。总的来讲,
<DIV
id=aiwedjjhatdkabgs>软vP$2?fjkN供~Sa.K</DIV>在多线程编程中要注意共享对象和数据的处理,不能忽视。因此,下面我们要讲的就是多线程中常见问题:<BR><U> 2.
多线程中VCL对象的使用<BR></U> 我们都知道,C++Builder编程是建立在VCL类库的基础上的。在程序中经常需要访问VCL对象的属性和方法。不幸的是,VCL类库并不保证其中对象的属性和方法是线程访问安全的(Thread_safe),访问VCL对象的属性或调用其方法可能会访问到不被别的线程所保护的内存区域而产生错误。因此,TThread对象提供了一个Synchronize方法,当需要在线程中访问VCL对象属性或调用方法时,通过Synchronize方法来访问属性或调用方法就能避免冲突,使各个线程之间协调而不会产生意外的错误。如下所示:<BR> void
__fastcall TNewThread::PushTheButton(void)<BR> <BR> {<BR>
Button1->Click();<BR> }<BR> <BR> void __fastcall
TNewThread::Execute()<BR> {<BR> ...<BR>
Synchronize((TThreadMethod)PushTheButton);<BR>
...<BR> }<BR> 对Button1-〉Click()方法的调用就是通过Synchronize()方法来实现的,
<DIV
id=hjhahaproiatfftfm>教理X垠dOd4n*8L$:5件#</DIV>它可以自动避免发生多线程访问冲突。在C++Builder中,虽然有一些VCL对象也是线程访问安全的(如TFont、TPen、TBrush等),可以不用Sychronize()方法对它们的属性方法进行访问调用以提高程序性能,但是,对于更多的无法确定的VCL对象,还是强烈建议使用Synchronize()方法确保程序的可靠性。<BR><U> 3.
多线程中公共数据的使用<BR></U> 程序设计中难免要在多个线程中共享数据或者对象。为了避免在多线程中因为同时访问了公共数据块而造成灾难性的后果,我们需要对公共数据块进行保护,直到一个线程对它的访问结束为止。这可以通过临界区域(Critical
Section)的使用来实现,所幸的是在C++Builder中,给我们提供了一个TCriticalSection对象来进行临界区域的划定。该对象有两个方法,Acquire()和Release()。它设定的临界区域可以保证一次只有一个线程对该区域进行访问。如下例所示:<BR> class
TNewThread : public TThread<BR> {<BR>
...<BR> private:<BR> TCriticalSection pLockX;<BR> int
x;<BR> float y;<BR> ...<BR> };<BR> void __fastcall
TNewThread::Execute()<BR> {<BR> ...<BR> pLockX->Acquire();<BR> x++;<BR> y=sin(x);<BR> pLockX->Release();<BR> ...<BR> }<BR> 这样,<FONT
id=gjqosqnmdr>gU|GlRq(h(</FONT>对公共变量x,y的访问就通过全局TCriticalSection
对象保护起来,避免了多个线程同时访问的冲突。<BR><U> 4.
多线程间的同步<BR></U> 当程序中多个线程同时运行,难免要遇到使用同一系统资源,或者一个线程的运行要依赖另一个线程的完成等等,这样需要在线程间进行同步的问题。由于线程同时运行,无法从程序本身来决定运行的先后快慢,使得线程的同步看起来很难实现。所幸的是<A
class=wordstyle href="http://www.malegebide.com/"
target=_blank>Windows</A>系统是多任务操作系统,系统内核为我们提供了事件(Event)、Mutex、信号灯(semaphore)和计时器4种对象来控制线程间的同步。在C++Builder中,为我们提供了用于创建Event的TEvent
对象供我们使用。<BR> 当程序中一个线程的运行要等待一项特定的操作的完成而不是等待一个特定的线程完成时,我们就可以很方便地用TEvent对象来实现这个目标。首先创建一个全局的TEvent对象作为所有线程可监测的标志。当一个线程完成某项特定的操作时,调用TEvent对象的SetEvent()方法,这样将设置这个标志,其他的线程可以通过监测这个标志获知操作的完成。相反,要取消这个标志,可以调用ResetEvent()方法。在需要等待操作完成的线程中使用WaitFor()方法,将一直等待这个标志被设置为止。注意WaitFor()方法的参数是等待标志设置的时间,一般用INFINITE表示无限等待事件的发生,如果其它线程运行有误,很容易使这个线程死住(等待一个永不发生的事件)。<BR> 其实直接用<A
class=wordstyle href="http://www.malegebide.com/"
target=_blank>Windows</A>
API函数也可以很方便地实现事件(Event)、信号(semaphore)控制技术。尤其是C++Builder,在调用<A
class=wordstyle href="http://www.malegebide.com/"
target=_blank>Windows</A>
API方面有着其它语言无可比拟的优势。所用的函数主要有:CreateSemaphore()、CreateEvent()、WaitForSingleObject()、ReleaseSemaphore()、SetEvent()等等。<BR>
<P></P></SPAN></SPAN>
<DIV class=Message id=Message></DIV></FONT></DIV>
<DIV></DIV></TD></TR>
<TR>
<TD
style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px"
align=right bgColor=#f7f7f7 height=25>[
<SCRIPT language=JavaScript
src="C++ Builder 高手进阶 (五)用BCB编写多线程应用程序.files/Hits.htm"></SCRIPT>
] [<A href="javascript:history.go(-1)">返回上一页</A>] [<A
href="javascript:window.print()">打 印</A>] [<A
href="http://www.malegebide.com/user/favorite.asp?action=add&topic=C++ Builder 高手进阶 (五)用BCB编写多线程应用程序">收
藏</A>]</TD></TR>
<TR>
<TD
style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">
<DIV>上一篇文章:<A
href="http://www.malegebide.com/article/1/14/2006/2006092518223.html">C++
Builder高手进阶 (四)动态显示任务栏图标</A></DIV>
<DIV>下一篇文章:<A
href="http://www.malegebide.com/article/1/14/2006/2006092518225.html">C++
Builder高手进阶 (三)用BCB设计DBTreeView组件(续二)</A></DIV></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=575 border=0>
<TBODY>
<TR>
<TD class=titlebg1>∷相关文章评论∷ (评论内容只代表网友观点,与本站立场无关!) [<A
href="http://www.malegebide.com/article/comment.asp?ArticleID=18224"
target=_blank>更多评论</A>…]</TD></TR>
<TR vAlign=top>
<TD></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- 页面底部开始 -->
<TABLE class=tableborder cellSpacing=0 cellPadding=0 width=778 align=center
border=0>
<TBODY>
<TR>
<TD height=5></TD></TR>
<TR>
<TD class=linebar height=8></TD></TR>
<TR>
<TD height=5></TD></TR>
<TR>
<TD class=tablebody align=middle height=65>QQ:310646 <A class=navmenu
href="http://www.malegebide.com/admin/admin_login.asp" target=_blank>A</A>
Copyright © 2006 <FONT face=Verdana, sans-serif Helvetica,
Arial,><B>Malegebide.Com</B></FONT>.
<SCRIPT language=javascript
src="C++ Builder 高手进阶 (五)用BCB编写多线程应用程序.files/529370.js"
type=text/javascript></SCRIPT>
No Rights Reserved <BR></TD></TR>
<TR>
<TD height=5></TD></TR></TBODY></TABLE>
<SCRIPT language=javascript
src="C++ Builder 高手进阶 (五)用BCB编写多线程应用程序.files/Std_StranJF.Js"></SCRIPT>
<!-- 页面底部结束 -->
<SCRIPT src="C++ Builder 高手进阶 (五)用BCB编写多线程应用程序.files/count.htm"
type=text/javascript></SCRIPT>
</BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -