delphi多线程

Delphi管理多线程之线程局部存储:threadvar

拜拜、爱过 提交于 2020-03-30 11:43:47
  尽管多线程能够解决许多问题,但是同时它又给我们带来了很多的问题。其中主要的问题就是:对全局变量或句柄这样的全局资源如何访问?另外,当必须确保一个线程中的某些事件要在另一个线程中的其他时间之前(或之后)发生时,该怎么办?这里将讲解通过使用由 Delphi提供的线程局部存储和 A P I为线程提供同步的方法。   这里先讲线程局部存储,下一篇再讲线程同步 线程局部存储   由于每个线程都代表一个不同的执行路径,因此,最好有一种只限于一个线程内部使用的数据存储方式。要实现上述目的有三种方式: 1) 第一种也是最简单的一种方式是局部变量((基于栈)。   由于每个线程都在各自的栈中,各个线程都将有一套局部变量的副本,这样,就不会互相影响。 2)第二种方式就是把有关信息保存在各自的线程对象中 3)第三种方式就是用Delphi的关键字 threadvar 来声明变量,以利用操作系统级的线程局部存储 1.把信息保存在TThread派生对象中   将相关信息保存在TThread派生对象中,这是一种线程局部存储可选的技术。相对于使用关键字threadvar的技术,这种方式更加简单、更加有效。例如,你可以在一个线程对象中加入下列信息 type TMyThread = class(TThread) private FLocalInt: Integer; FLocalStr: String; .. .

delphi 多线程2

梦想的初衷 提交于 2020-02-18 13:43:35
多线程常用的内核对象:CreateEvent事件,CreateMutex互斥,CreateSemaphore信号,CreateWaitableTimer计时器 {建立事件} function CreateEvent( lpEventAttributes: PSecurityAttributes; {!} bManualReset: BOOL; bInitialState: BOOL; lpName: PWideChar ): THandle; stdcall; {建立互斥} function CreateMutex( lpMutexAttributes: PSecurityAttributes; {!} bInitialOwner: BOOL; lpName: PWideChar ): THandle; stdcall; {建立信号} function CreateSemaphore( lpSemaphoreAttributes: PSecurityAttributes; {!} lInitialCount: Longint; lMaximumCount: Longint; lpName: PWideChar ): THandle; stdcall; {建立等待计时器} function CreateWaitableTimer( lpTimerAttributes:

Delphi管理多线程之线程局部存储:threadvar

可紊 提交于 2020-01-05 03:25:49
Delphi管理多线程之线程局部存储:threadvar   尽管多线程能够解决许多问题,但是同时它又给我们带来了很多的问题。其中主要的问题就是:对全局变量或句柄这样的全局资源如何访问?另外,当必须确保一个线程中的某些事件要在另一个线程中的其他时间之前(或之后)发生时,该怎么办?这里将讲解通过使用由 Delphi提供的线程局部存储和 A P I为线程提供同步的方法。   这里先讲线程局部存储,下一篇再讲线程同步 线程局部存储   由于每个线程都代表一个不同的执行路径,因此,最好有一种只限于一个线程内部使用的数据存储方式。要实现上述目的有三种方式: 1)第一种也是最简单的一种方式是局部变量((基于栈)。   由于每个线程都在各自的栈中,各个线程都将有一套局部变量的副本,这样,就不会互相影响。 2)第二种方式就是把有关信息保存在各自的线程对象中 3)第三种方式就是用Delphi的关键字 threadvar 来声明变量,以利用操作系统级的线程局部存储 1.把信息保存在TThread派生对象中   将相关信息保存在TThread派生对象中,这是一种线程局部存储可选的技术。相对于使用关键字threadvar的技术,这种方式更加简单、更加有效。例如,你可以在一个线程对象中加入下列信息 1 2 3 4 5 6 7 8 type TMyThread = class (TThread)

Delphi管理多线程之线程局部存储:threadvar

▼魔方 西西 提交于 2019-12-04 09:16:58
转载自: https://www.cnblogs.com/xumenger/p/4450634.html 尽管多线程能够解决许多问题,但是同时它又给我们带来了很多的问题。其中主要的问题就是:对全局变量或句柄这样的全局资源如何访问?另外,当必须确保一个线程中的某些事件要在另一个线程中的其他时间之前(或之后)发生时,该怎么办?这里将讲解通过使用由 Delphi提供的线程局部存储和 A P I为线程提供同步的方法。   这里先讲线程局部存储,下一篇再讲线程同步 线程局部存储   由于每个线程都代表一个不同的执行路径,因此,最好有一种只限于一个线程内部使用的数据存储方式。要实现上述目的有三种方式: 1)第一种也是最简单的一种方式是局部变量((基于栈)。   由于每个线程都在各自的栈中,各个线程都将有一套局部变量的副本,这样,就不会互相影响。 2)第二种方式就是把有关信息保存在各自的线程对象中 3)第三种方式就是用Delphi的关键字 threadvar 来声明变量,以利用操作系统级的线程局部存储 1.把信息保存在TThread派生对象中   将相关信息保存在TThread派生对象中,这是一种线程局部存储可选的技术。相对于使用关键字threadvar的技术,这种方式更加简单、更加有效。例如,你可以在一个线程对象中加入下列信息 1 2 3 4 5 6 7 8 type TMyThread =

Delphi线程同步(临界区、互斥、信号量)

限于喜欢 提交于 2019-12-04 09:14:31
转载自: https://www.cnblogs.com/xumenger/p/4450659.html 当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源。   例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件的字符数。当然,在整个文件调入内存之前,统计它的计数是没有意义的。但是,由于每个操作都有自己的线程,操作系统会把两个线程当做是互不相干的任务分别执行,这样就可能在没有把整个文件装入内存时统计字数。为解决此问题,你必须使两个线程同步工作   存在一些线程同步地址的问题,Win 32 提供了许多线程同步的方式。这里将会讲到:临界区、互斥、信号量和事件   为了检验这些技术,首先来看一个需要线程同步解决的问题。假设有一个整数数组,需要按照升序赋初值。现在要在第一遍把这个数组赋初值为1~128,第二遍将此数组赋初值为128~255,然后结果显示在列表中。要用两个线程来分别进行初始化。下面的代码给出了没有做线程同步的代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

Delphi中怎么结束线程(这个线程是定时执行的)(方案一)

五迷三道 提交于 2019-12-04 09:12:53
转载自 https://www.cnblogs.com/xumenger/p/4453902.html 在线程对象被释放之前,首先要检查线程是否还在执行中,如果线程还在执行中(线程ID不为0,并且线程结束标志未设置),则调用Terminate 过程结束线程。Terminate 过程只是简单地设置线程类的 Terminated标志,如下面的代码: 1 2 3 4 procedure TThread . Terminate; begin FTerminated:= True ; end ;   所以线程仍然必须继续执行到正常结束之后才行,而不是立即终止线程,这一点要注意   在这里说一些题外话:如何才能“立即”终止线程(当前是指用TThread 创建的线程)。结果当然是不行!终止线程的唯一的方法就是让Execute 方法执行完毕, 所以一般来说,要让你的线程能尽快终止,必须在Execute 方法中在较短的时间内不断检查Terminated标志,以便能及时地退出。这是设计线程代码的一个很重要的原则!   当然如果你一定要能“立即”退出线程,那么TThread 类不是一个好的选择,因为如果用API强制终止线程的话,最终会导致TThread 线程对象不能被正确释放,在对象析构时出现 Access Violation。这种情况你只能使用API或者RTL函数来创建线程 比如这样一个例子

Delphi线程基础知识

橙三吉。 提交于 2019-12-04 09:01:46
参考 http://blog.chinaunix.net/uid-10535208-id-2949323.html 一、概述   Delphi提供了好几种对象以方便进行多线程编程。多线程应用程序有以下几方面的功能:   1.避免性能瓶颈:单线程应用程序在进行比较慢的操作如磁盘读写的时候,CPU必须停下来等待,直到该操作执行完毕。而多线程应用程序在进行比较慢的操作如磁盘读写的时候,即系执行另一个单独的线程;   2.组织应用才程序的行为: 通常,一个程序的行为可以组织成几个功能相互独立的平行的处理过程。将这些独立的处理组织成单独的几个线程,就可以同时启动这几个处理过程。 还可以使用线程的优先级来控制那些任务获得更多的CPU时间 二、定义线程对象   在大多数情况下,可以使用线程对象来代表一个线程。线程对象封装了常用的线程操作,从而简化了线程对象   注意: 线程对象不允许控制线程的安全属性和栈的大小。如果你确实要控制这些东西,那只能够使用BeginThread函数来创建线程了。   要在程序中使用线程对象,必须自定义一个从TThread派生的类。可以使用想到来帮助创建,生成的代码如下: unit Unit2; interface uses Classes; type TMyThread = class(TThread) private {Private declarations}

delphi 讲的比较详细的多线程

喜欢而已 提交于 2019-12-03 17:54:30
在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程。 为了保证线程的安全性请大家看看下面介绍 Delphi 多线程同步的一些处理方案大家可以参考: http://www.cr173.com/html/16747_1.html 主线程又程为UI线程。 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。如果有兴趣深入的话,我建议你们看看《现代操作系统》或者《操作系统的设计与实现》。对就个问题说得比较清楚。 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以仅仅是看上去会一些,明白了2+2的时候,其实我还不知道1+1。 开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解. 先试试这个: procedure TForm1 . Button1Click (Sender: TObject) ; var i: Integer; begin for i

delphi 讲的比较详细的多线程

故事扮演 提交于 2019-12-03 17:42:29
在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程。 为了保证线程的安全性请大家看看下面介绍 Delphi 多线程同步的一些处理方案大家可以参考: http://www.cr173.com/html/16747_1.html 主线程又程为UI线程。 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。如果有兴趣深入的话,我建议你们看看《现代操作系统》或者《操作系统的设计与实现》。对就个问题说得比较清楚。 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以仅仅是看上去会一些,明白了2+2的时候,其实我还不知道1+1。 开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解. 先试试这个: procedure TForm1 . Button1Click (Sender: TObject) ; var i: Integer; begin for i

delphi 多线程编程

我是研究僧i 提交于 2019-11-27 05:02:44
开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解. 先试试这个: procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to 500000 do begin Canvas.TextOut(10, 10, IntToStr(i)); end; end; View Code 上面程序运行时, 我们的窗体基本是 "死" 的, 可以在你在程序运行期间拖动窗体试试... Delphi 为我们提供了一个简单的办法(Application.ProcessMessages)来解决这个问题: procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i := 0 to 500000 do begin Canvas.TextOut(10, 10, IntToStr(i)); Application.ProcessMessages; end; end; View Code 这个 Application.ProcessMessages; 一般用在比较费时的循环中, 它会检查并先处理消息队列中的其他消息. 但这算不上多线程, 譬如: 运行中你拖动窗体, 循环会暂停下来...