当前位置:天才代写 > tutorial > C语言/C++ 教程 > C++Builer中多线程的实现

C++Builer中多线程的实现

2017-11-05 08:00 星期日 所属: C语言/C++ 教程 浏览:395

副标题#e#

还在Dos时代,人们就在寻求一种多任务的实现。于是呈现了TSR范例的靠山驻留措施,较量有代表性的有Side Kick、Vsafe等优秀的TSR措施,这类措施的呈现和应用确实给用户利用计较机带来了极大的利便,好比Side Kick,我们编程可以在不消进编辑措施的状态下,一边编辑源措施,一边编译运行,很是利便。可是,Dos单任务操纵系统的致命缺陷注定了在Dos下不行能开拓出真正的多任务措施。进入Windows3.1时代,这种环境依然没有基础的改变,一次应用只能做一件事。好比数据库查询,除非应用编得很好,在查询期间整个系统将不响应用户的输入。

进入了Windows NT和Windows 9x时代,环境就有了彻底的更改,操纵系统从真正意义上实现了多任务(严格地说,Win9x还算不上)。一个应用措施,在需要的时候可以有很多个执行线程,每个线程就是一个小的执行措施,操纵系统自动使各个线程共享CPU资源,确保任一线程都不能使系统死锁。这样,在编程的时候,可以把费时间的任务移到靠山,在前台用另一个线程接管用户的输入。对那些对及时性要求较量高的编程任务,如网络客户处事、串行通信等应用时,多线程的实现无疑大大地加强了措施的可用性和稳固性。

在Windows NT和Windows 9x中,多线程的编程实现需要挪用一系列的API函数,如CreateThread、ResumeThread等,较量贫苦并且容易堕落。我们利用Inprise公司的新一代RAD开拓东西C++Builder,可以利便地实现多线程的编程。与老牌RAD东西Visual Basic和Delphi比,C++Builer不只成果很是强大,并且它的编程语言是C++,对付系统开拓语言是C的Windows系列操纵系统,它具有其它编程语言无可相比的优势。操作C++Builder提供的Tthread工具,多线程的编程变得很是轻便易用。那么,如何实现呢?且待我逐步道来,让你体会一下多线程的强大成果。

1.建设多线程措施:

首先,先先容一下实现多线程的详细步调。在C++Builder中固然用Tthread工具说明白线程的观念,可是Tthread工具自己并不完整,需要在Tthread下新建其子类,并重载Execute要领来利用线程工具。在C++Builder下可以很利便地实现这一点。

在C++Builder IDE情况下选择菜单File|New,在New栏中选中Thread Object,按OK,接下来弹出输入框,输入Tthread工具子类的名字MyThread,这样C++Builder自动为你建设了一个名为TMyThread的Tthread子类。同时编辑器中多了一个名为Unit2.cpp的单位,这就是我们建设的TMyThread子类的原码,如下:

#include
#pragma hdrstop
#include “Unit2.h”
#pragma package(smart_init)
//---------------------
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall MyThread::UpdateCaption()
// {
// Form1->Caption = “Updated in a thread”;
// }
//--------------------
__fastcall MyThread::MyThread(bool CreateSuspended)
: Tthread(CreateSuspended)
{
}
//--------------------
void __fastcall MyThread::Execute()
{
//---- Place thread code here ----
}
//---------------------

个中的Execute()函数就是我们要在线程中实现的任务的代码地址处。在原代码中包括Unit2.cpp,这个由我们建设的TMyThread工具就可以利用了。利用时,动态建设一个TMyThread 工具,在结构函数中利用Resume()要领,那么措施中就增加了一个新的我们本身界说的线程TMyThread,详细执行的代码就是Execute()要领重载的代码。要加载更多的线程,不要紧,只要继承建设需要数量的TMyThread 工具就成。

以上我们劈头地实现了在措施中建设一个自界说的线程,并使措施实现了多线程应用。可是,多线程应用的实现,并不是一件简朴的事情,还需要思量许多使多个线程能在系统中共存、互不影响的因素。好比,措施中民众变量的会见、资源的分派,假如处理惩罚不妥,不只线程会死锁陷入杂乱,甚至大概会造成系统瓦解。总的来讲,在多线程编程中要留意共享工具和数据的处理惩罚,不能忽视。因此,下面我们要讲的就是多线程中常见问题:


#p#副标题#e#

2.多线程中VCL工具的利用

我们都知道,C++Builder编程是成立在VCL类库的基本上的。在措施中常常需要会见VCL工具的属性和要领。不幸的是,VCL类库并不担保个中工具的属性和要领是线程会见安详的(Thread_safe),会见VCL工具的属性或挪用其要领大概会会见到不被此外线程所掩护的内存区域而发生错误。因此,Tthread工具提供了一个Synchronize要领,当需要在线程中会见VCL工具属性或挪用要领时,通过Synchronize要领来会见属性或挪用要领就能制止斗嘴,使各个线程之间协调而不会发生意外的错误。如下所示:

#p#分页标题#e#

void __fastcall TMyThread::PushTheButton(void)
{
Button1->Click();
}
void __fastcall TMyThread::Execute()
{

Synchronize((TThreadMethod)PushTheButton);

}

对Button1-〉Click()要领的挪用就是通过Synchronize()要领来实现的,它可以自动制止产生多线程会见斗嘴。在C++Builder中,固然有一些VCL工具也是线程会见安详的(如Tfont、Tpen、Tbrush等),可以不消Sychronize()要领对它们的属性要领举办会见挪用以提高措施机能,可是,对付更多的无法确定的VCL工具,照旧强烈发起利用Synchronize()要领确保措施的靠得住性。

3.多线程中民众数据的利用

措施设计中不免要在多个线程中共享数据可能工具。为了制止在多线程中因为同时会见了民众数据块而造成劫难性的效果,我们需要对民众数据块举办掩护,直到一个线程对它的会见竣事为止。这可以通过临界区域(Critical Section)的利用来实现,所幸的是在C++Builder中,给我们提供了一个TCriticalSection工具来举办临界区域的规定。该工具有两个要领,Acquire()和Release()。它设定的临界区域可以担保一次只有一个线程对该区域举办会见。如下例所示:

class MyThread : public Tthread
{

private:
TCriticalSection pLockX;
int x;
float y;

};
void __fastcall MyThread::Execute()
{

pLockX->Acquire();//Here pLockX is a Global CriticalSection variable.
x++;
y=sin(x);
pLockX->Release();

}

这样,对民众变量x,y的会见就通过全局TCriticalSection 工具掩护起来,制止了多个线程同时会见的斗嘴。

4.多线程间的同步

当措施中多个线程同时运行,不免要碰着利用同一系统资源,可能一个线程的运行要依赖另一个线程的完成等等,这样需要在线程间举办同步的问题。由于线程同时运行,无法从措施自己来抉择运行的先后快慢,使得线程的同步看起来很难实现。所幸的是Windows系统是多任务操纵系统,系统内核为我们提供了事件(Event)、Mutex、信号灯(semaphore)和计时器4种工具来节制线程间的同步。在C++Builder中,为我们提供了用于建设Event的Tevent 工具供我们利用。

当措施中一个线程的运行要期待一项特定的操纵的完成而不是期待一个特定的线程完成时,我们就可以很利便地用Tevent工具来实现这个方针。首先建设一个全局的Tevent工具作为所有线程可监测的符号。当一个线程完成某项特定的操纵时,挪用Tevent工具的SetEvent()要领,这样将配置这个符号,其他的线程可以通过监测这个符号获知操纵的完成。相反,要打消这个符号,可以挪用ResetEvent()要领。在需要期待操纵完成的线程中利用WaitFor()要领,将一直期待这个符号被配置为止。留意WaitFor()要领的参数是期待符号配置的时间,一般用INFINITE暗示无限期待事件的产生,假如其它线程运行有误,很容易使这个线程死住(期待一个永不产生的事件)。

其实直接用Windows API函数也可以很利便地实现事件(Event)、信号灯(semaphore)节制技能。尤其是C++Builder,在挪用Windows API方面有着其它语言无可相比的优势。所用的函数主要有:CreateSemaphore()、CreateEvent()、WaitForSingleObject()、ReleaseSemaphore()、SetEvent()等等,这里就不赘述了。

本文团结Inprise(Borland)公司开拓的强大的RAD东西C++Builder的编程,对Windows下的多线程编程作了较量全面的先容。其实多线程的实现并不神秘,看了本文,你也可以编出本身的多线程措施,真正体会多任务操纵系统的威力。

附:本文是本人在利用C++Builder一年来的一些实践体会。在完本钱身的项目标同时,发明对多线程的编程一般的书籍都先容得较量少,而实际应用中,多线程编程又是如此的重要,因此,本文通过对多线程编程较量全面的先容,愿能到达抛砖引玉之效。

 

    关键字:

天才代写-代写联系方式