在C++Builer中多线程的实现
在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,可以轻松实现多线程编程。C++Builder与老的RAD工具Visual Basic和Delphi相比,不仅功能非常强大,而且它的编程语言是C++。对于系统开发语言为C的Windows系列操作系统来说,具有其他编程语言无法比拟的优势。使用C++Builder提供的TThread对象,多线程编程变得非常简单易用。那么,如何实现呢?让我向你展示多线程的强大功能。
1.创建多线程程序:
首先介绍一下实现多线程的具体步骤。在C++Builder中,虽然用TThread对象解释了线程的概念,但是Tthread对象本身并不完整,需要在Tthread下新建一个子类,重载Execute方法才能使用thread对象。这在C++Builder中很容易实现。
在c++builder ide环境下,选择菜单文件New,在New列中选择Thread对象,按OK,然后弹出输入框,输入TThread对象MyThread的子类名称,这样c++builder就会自动为你创建一个名为t MyThread的TThread子类。同时,编辑器中还有一个名为Unit2.cpp的附加单元,这是我们创建的TMyThread子类的原始代码,如下:
#包括
#pragma hdrstop
#包含“Unit2.h”
#pragma包(smart_init)
// -
//重要:VCL中对象的方法和属性只能是
//用在名为using Synchronize的方法中,例如:
//
//Synchronize(update caption);
//
//其中UpdateCaption可能类似于:
//
//void _ _ fast call MyThread::update caption()
// {
// Form1->Caption = "在一个线程中更新";
// }
// -
_ _ fast call MyThread::MyThread(bool create suspended)
:TThread(创建挂起的)
{
}
// -
void _ _ fast call MyThread::Execute()
{
// -将线程代码放在这里-
}
// -
的Execute()函数是我们要在线程中实现的任务的代码所在的位置。原代码包含Unit2.cpp,可以使用我们创建的这个TMyThread对象。使用时,动态创建一个TMyThread对象,在构造函数中使用Resume()方法,那么程序中就会增加一个我们自己定义的新线程TMyThread,具体执行的代码就是execute()方法重载的代码。要加载更多的线程,没关系,只需根据需要创建尽可能多的TMyThread对象。
以上,我们初步实现了在程序中创建一个自定义线程,并使程序实现多线程应用。但是多线程应用的实现并不是一件简单的事情,需要考虑很多让多线程在系统中共存且互不影响的因素。比如程序中公共变量的访问和资源的分配处理不当,不仅线程会被锁进混乱状态,系统甚至可能崩溃。一般来说,多线程编程要注意对共享对象和数据的处理,不能忽视。
位律师回复
0条评论