`
buliedian
  • 浏览: 1237663 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ZT:C++Builder的多线程编程中一些体会

阅读更多

最近在写一个程序用到了多线程,所以对CB下的多线程有一定的学习。
现在把自己的一些心得讲一下。水平有限,写的很粗略,请大家见谅。

CB相对于VC来说,在CB下写多线程程序是很简单的。不仅是VCL中有TThread这个类。封装了那些关于多线程的WINDOW API。我觉得更方便的是他提供了
直接访问主VCL线程中对象的能力。可以很容易的和主线程中的窗体,控件
打交道。和单线程的方式没有太多区别。只是在有多个线程都要访问主线程
中的对象(比如访问同一个窗体上的StringGrid).只要用Thread的Synchronize方法来调用那段访问主VCL线程的代码(具体请看帮助),我们就不用担心访问冲突的问题了。而且对于多线程的同步和互斥,CB也对WINDOW 编程中那些机制进行了封装。比如对临界区CriticalSection封装为TCriticalSection.事件Event封装为TEvent.这些类相当简单好用。
下面就是我觉得比较重要的几点,供大家参考.


1。TThread的WaitFor方法。是等待一个线程返回。其返回值在这个线程里可以任意设定。以便在该线程返回的时候让调用他的线程知道他的运行情况。

在TThread的 OnTerminate事件中做线程的清除工作。他不是线程运行的一部分。
而是主VCL线程的一部分。所以在其中不能访问Thread的局部变量(如 int __thread i)
你可以把清楚代码写在这里,不用管现在在EXCUTE()方法执行到了哪个地方。
这么看起来有点类似于C++里的 finally 块的作用。

2。TEvent很重要。实现线程的同步。WaitFor(int Timeout)功能类似于
WINDOW API WaitforSingleObject().返回值包括:
其中参数Timeout可以设为INFINITE表示永久等待,但这样,程序很容易死在这里。

wrSignaled 该事件发生(成功返回).
wrTimeout 等待超时.
wrAbandoned 在该事件的超时期限到达前,该事件对象已经被毁灭了。.
wrError 在等待过程中有异常产生,要知道具体产生的错误要查看 TEvent的LastError
属性。

3 TCriticalSection
这个相当于WIN32编程中的临界区。
在多线程编程中,多个线程需要访问同一个公用变量的时候。

来保证访问的正确性。对公用变量访问的代码写在Enter();和Leave()之间。
比如有个公用变量 Count;
以下代码 :
TCriticalSection * pSection=new TCriticalSection();
pSection->Enter();
Count++;
pSection->Leave();
delete p;

Enter()方法进入临界区,对其中的公用变量加锁。
Leave()方法离开临界区,对其中的公用变量解锁。


4.TMultiReadExclusiveWriteSynchronizer
用来处理类似于多个生产者和多个消费者的问题。这里的消费者是指
对公用变量进行读操作的线程。
生产者是对公用变量进行写操作的线程。

四个方法。
BeginRead
EndRead
这两个方法用于消费者。
BeginWrite
EndWrite
这两个方法用于生产者。

使用的时候就是要把这个TMutiReadExclusiveWriteSynchronizer 定义一个全局变量。然后在其他线程中访问他。

<!-- google firefox -->

<!-- google_ad_client = "pub-8722551381340391"; google_ad_width = 468; google_ad_height = 60; google_ad_format = "468x60_as_rimg"; google_cpa_choice = "CAAQycb8zwEaCNrmdvgKt1bFKJnA93M"; // -->

分享到:
评论

相关推荐

    是男人就下100层,C++编程实例大作业.docx

    C++编程实例大作业 从给定的文件信息中,我们可以提取出以下知识点: ...该文件展示了C++编程、Windows编程、游戏开发、图形处理、编程实践、游戏设计、算法设计、数据结构、编程工具、游戏开发框架等多方面的知识点。

    ZT213/ZT213LEEA规格书V2.10-低功耗RS232多通道USB收发器/驱动器芯片手册

    ZT213/ZT213LEEA芯片凭借其强大的RS232通信能力、低功耗特性以及多通道支持,成为各类需要USB到串行转换的系统中的理想选择。通过深入理解和正确应用这款芯片,可以有效地提升设备的性能,降低系统设计的复杂度,...

    空间后方、前方交会算法的C++实现

    ### 空间后方、前方交会算法的C++实现 #### 一、概述 ...C++作为一种高效灵活的编程语言,在实现这类算法时能够提供强大的支持。本文所提供的代码框架为理解和实现这些算法提供了一个良好的起点。

    zt-exec-1.9-API文档-中文版.zip

    赠送jar包:zt-exec-1.9.jar; 赠送原API文档:zt-exec-1.9-javadoc.jar; 赠送源代码:zt-exec-1.9-sources.jar; 赠送Maven依赖信息文件:zt-exec-1.9.pom; 包含翻译后的API文档:zt-exec-1.9-javadoc-API文档-...

    zt411-zt421-ug-zhcn_ZT411/ZT421_斑马打印机手册_

    斑马打印机ZT411和ZT421是工业级条码和标签打印机,广泛应用于制造业、物流、零售业等对打印质量和效率有高要求的领域。这两款打印机以其出色的性能、耐用性和易用性赢得了用户的信赖。这份中文手册详细地介绍了ZT...

    斑马zt410中文库

    斑马(Zebra)ZT410是一款先进的桌面级条码打印机,被广泛应用于物流、零售、医疗、制造业等多个行业。这款打印机以其高效、耐用和易于操作的特点深受用户喜爱。"斑马zt410中文库"指的是为ZT410打印机特别设计的中文...

    Linux 下编程的三个重要工具(ZT).rar_linux rar_linux 编程

    本资源"Linux下编程的三个重要工具(ZT)"似乎提供了一些关键工具的介绍,虽然具体细节未在描述中详述,但我们可以根据常见的编程工具来探讨这三个可能的重要工具。以下是Linux编程中经常使用的三大工具的详细讲解:...

    C++ 线程池示例,VS2015编译通过

    一个简单的线程池示例,可以自定义线程数量和执行任务,代码简洁可扩展性强。在使用上也很方便。下面是一个简单的调用 int main() { xcyk::ThreadPool threadPool("xcyk"); SYSTEM_INFO SystemInfo; ...

    是男人就下100层-C++编程实例大作业.docx

    “是男人就下100层”C++编程实例大作业涉及到了Windows编程的基本框架、位图资源的加载与绘制、游戏状态管理、物理模拟等多个方面,对于学习C++编程和游戏开发具有较高的参考价值。通过分析这段代码,可以了解到如何...

    C++中的虚函数和纯虚函数用法(ZT)

    在面向对象编程中,多态性是一项非常重要的特性,它允许程序通过基类指针或引用调用派生类的方法。C++中实现多态性的主要机制之一就是虚函数。虚函数和纯虚函数是C++中用于实现多态的重要概念。本文将详细介绍虚函数...

    中国象棋游戏源码 C++

    7. **多线程**:在高级版本的游戏中,可能会使用多线程技术来实现异步操作,如用户操作与AI思考同步进行。 8. **设计模式**:在源码中,可能会运用到如工厂模式(用于创建棋子对象)、观察者模式(更新棋盘状态时...

    斑马打印机ZT210用户指南

    "斑马打印机ZT210用户指南" 本用户指南旨在为Zebra ZT210/ZT220/ZT230打印机的用户提供操作和维护指南,该设备是一种工业级的条码打印机,具有高速打印、高速处理和高质量打印输出等特点。 版权信息 本手册的版权...

    assignments-zt6801:GitHub Classroom创建的assignments-zt6801

    在"assignments-zt6801"这个项目中,我们可以预期一系列围绕C++编程的练习和挑战。这些练习通常会涵盖C++的基础语法,包括变量、数据类型、控制流(如条件语句和循环)、函数、数组、指针等核心概念。随着学习的深入...

    zt-exec-1.9-API文档-中英对照版.zip

    赠送jar包:zt-exec-1.9.jar; 赠送原API文档:zt-exec-1.9-javadoc.jar; 赠送源代码:zt-exec-1.9-sources.jar; 赠送Maven依赖信息文件:zt-exec-1.9.pom; 包含翻译后的API文档:zt-exec-1.9-javadoc-API文档-...

    zt.zip_判断

    这个文件"zt.h"可能是C++、C或类似编程语言中的头文件,它可能包含了函数声明、常量定义或者枚举类型等,这些都是为了进行特定的判断操作而设计的。 在编程领域,"判断"通常指的是条件语句,例如if语句和switch语句...

    【精品珍藏】C、C++热门精品资料集(共110个)

    #### 一、C/C++编程语言的重要性与学习资源现状 C 和 C++ 作为计算机科学领域的基石性编程语言,一直以来都是开发人员的必修课程之一。这两种语言因其高效性和灵活性而在系统编程、游戏开发、嵌入式系统等领域占据...

    CPP_collection.7z

    【标签】"CPP资料" 表明这个压缩包中的内容与C++编程语言紧密相关,可能涵盖了C++的语法、数据结构、算法、STL(标准模板库)、设计模式、多线程、网络编程等多个方面。 【压缩包子文件的文件名称列表】: 1. **...

    RS485通信芯片zt13085e的原理图库和PCB库

    RS485通信芯片ZT13085E是一种常用的工业级串行通信接口芯片,主要用于构建远程、多节点的通信网络。在工业自动化、楼宇自动化、物联网设备等领域有广泛应用。ZT13085E的设计目标是提供一种高效、可靠的数据传输方式...

Global site tag (gtag.js) - Google Analytics