首先看TThread源码中关于OnTerminate的代码: public .... property OnTerminate: TNotifyEvent read FOnTerminate write FOnTerminate; ... end; 再看Delphi自带的帮助手册中对于OnTerminate的解释: Occurs after the thread's Execute method has returned and before the thread is destroyed. p…
一.生命周期 线程的生命周期全在一张图中,理解此图是基本: 线程状态图 一.新建和就绪状态 当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时它和其他的Java对象一样,仅仅由Java虚拟机为其分配内存,并初始化其成员变量的值.此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体. 当线程对象调用了start()方法之后,该线程处于就绪状态.Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了.至于该…
使用线程同步解决多线程安全问题 上一篇 Java基础-多线程-②多线程的安全问题 中我们说到多线程可能引发的安全问题,原因在于多个线程共享了数据,且一个线程在操作(多为写操作)数据的过程中,另一个线程也对数据进行了操作,从而导致数据出错.由此我们想到一个解决的思路:将操作共享数据的代码行作为一个整体,同一时间只允许一个线程执行,执行过程中其他线程不能参与执行.线程同步就是用来实现这样的机制. synchronized代码块 Java中提供了synchronized关键字,将可能引发安全问题的代码…
一.什么是多线程 Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorService.Callable.Future实现有返回结果的多线程.一般主要用前面两种方法. 1.继承 Thread 方法 实现多线程 //继承 Thread 方法 public class MyThread extends Thread { public void run() { System.ou…
我们对线程访问同一份资源的多个线程之间,来进行协调的这个东西,就是线程同步.   例子1:模拟了多个线程操作同一份资源,可能带来的问题: package com.cy.thread; public class TestSync implements Runnable{ Timer timer = new Timer(); public static void main(String[] args) { TestSync test = new TestSync(); Thread t1 = new…
线程同步 线程同步:当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多. 为什么要创建多线程? 在一般情况下,创建一个线程是不能提高程序的执行效率的,所以要创建多个线程. 为什么要线程同步 多个线程同时运行的时候可能调用线程函数,在多个线程同时对同一个内存地址进行写入,由于CPU时间调度上的问题,写入数据会被多次的覆盖,所以就要使线程同步. 例如:我们去银行存钱,那肯定…
(整理自网络) Delphi多线程处理 1-1多线程的基本概念 WIN 98/NT/2000/XP 是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU 运行时间和资源,或者说,把CPU 时间划成片,每个片分给不同的线程,这样,每个线程轮流的“挂起”和“唤醒”,由于时间片很小,给人的感觉是同时运行的. 多线程带来如下好处:(自己阅读) 1)避免瓶颈: 2)并行操作: 3)提高效率: 在多线程中,通过优先级管理,可以使重要的程序优先操作,提高了任务管理的灵活性. 另一方面…
文章来源: http://liukun966123.my.gsdn.net/2004/10/22/4797/ Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对 TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchronize的用法就完了.然而这并不是多线程编程的全部,我写此文的目的在于对此作一个补充. 线程本质上是进程中一段并发运行的代码.一个进程至少有一个线程,即所谓的主线程.同时还可以有多个子线…
 多线程程序设计 我们知道,win95或winNT都是“多线程”的操作系统,在DELPHI .中,我们可以充分利用这一特性,编写出“多线程”的应用程序. 对以往在DOS或16位windows下写程序的人来说,“多线程”仍然是陌生的,但如同以前我们从DOS下的单任务过渡到windows3.下的多任务,如今我们又必须过渡到“多线程”领域,毕竟计算机时代是在不断发展的.不过,幸运的是,在DELPHI2.下进行多线程程序设计并不需要我们去学习庞大的WIN32API函数,我们可以利用DELPHI下标准的多…
以下是一篇很值得看的关于Delphi多线程编程的文章,内容很全面,建议收藏. 一.入门 ㈠. function CreateThread(    lpThreadAttributes: Pointer;           {安全设置}    dwStackSize: DWORD;                    {堆栈大小}    lpStartAddress: TFNThreadStartRoutine; {入口函数}    lpParameter: Pointer;         …
Delphi中Spcomm使用属性及用法详解 Delphi是一种具有 功能强大.简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选择 Delphi作为开发工具编制各种应用程序.但是,美中不足之处是 Delphi没有自带的串口通信控件,在它的帮助文档里也没有提及串口通信,这就给编制通信程序的开发人员带来许多不便. 目前,利用 Delphi实现串口通信的常用的方法有 3种:一是利用控件,如 MSCOMM控件和 SPCOMM控件:二…
Abort 函数 引起放弃的意外处理 Abs 函数 绝对值函数 AddExitProc 函数 将一过程添加到运行时库的结束过程表中 Addr 函数 返回指定对象的地址 AdjustLineBreaks 函数 将给定字符串的行分隔符调整为CR/LF序列 Align 属性 使控件位于窗口某部分 Alignment 属性 控件标签的文字位置 AllocMem 函数 在堆栈上分配给定大小的块 AllowGrayed 属性 允许一个灰度选择 AnsiCompareStr 函数 比较字符串(区分大小写) A…
开始本应该是一篇洋洋洒洒的文字, 不过我还是提倡先做起来, 在尝试中去理解.先试试这个: procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin do begin Canvas.TextOut(, , IntToStr(i)); end; end; 上面程序运行时, 我们的窗体基本是 "死" 的, 可以在你在程序运行期间拖动窗体试试... Delphi 为我们提供了一个简单的办法(Application…
学习笔记:delphi多线程知识 最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处. Delphi的线程同步方法: .临界区 申明一个临界资源 FLock : TRTLCriticalSection; 先初化一个临界资源对象 InitializeCriticalSection(FLock) 销毁临界资源对象 DeleteCriticalSection(FLock) procedu…
最近Ken在比较系统地学习Delphi多线程编程方面的知识,在网络上查阅了很多资料.现在Ken将对这些资料进行整理和修改,以便收藏和分享.内容基本上是复制粘贴,拼拼凑凑,再加上一些修改而来.各个素材的来源已经很难搞清楚,因此不再一一说明.一些资料可能有点老,但仍然有参考价值.篇幅比较长,耐心点看完吧. 多线程共存于应用程序中是现代操作系统中的基本特征和重要标志.为了提高程序的运行效率,在操作系统中提出了进程和线程的概念,在一个进程中可以包含多个线程,进程作为资源分配的基本单位,线程作为独立运行和…
前言: 几个月前接到一个任务:将一后台程序访问数据库的方式从BDE改为ADO,原因是由于业务量的增加,通过BDE不论是向数据库写入数据还是从数据库中读出数据的速度都变得无法忍受,大家都知道ADO在数据库访问速度方面比BDE要快的多了(我写了一个测试程序使用ADO比使用BDE快了近100倍!).这个任务还不简单嘛,只要将BDE的控件更换成ADO的再修改一些代码不就搞定了!我当时确实是这么想的,而且用了不到一个小时就搞定,测试运行一段没问题,大功告成了,我想.谁知道一个恶梦就此开始,我的愚昧无知使我…
在多线程应用中锁是一个很简单又很复杂的技术,之所以要用到锁是因为在多进程/线程环境下,一段代码可能会被同时访问到,如果这段代码涉及到了共享资源(数据)就需要保证数据的正确性.也就是所谓的线程安全.之前写过一篇着于Java线程安全的博客:链接 我是在写一个服务端程序时应用到读写锁,在一个内存缓存.先来看看排斥锁的写法,代码如下: function TValueCalc.GetValue(const key: string): TCache; var objCache: TCache; begin…
原文地址 http://www.cnblogs.com/mazhenyu/archive/2010/04/29/1724190.html 关于这个问题以前只知道多个线程不能同时使用一个RC,结果为了能动态加载,当初还做了一个通过拆分主线程的工作来模拟多线程加载的伪多线程程序,今天突然很想把这个问题彻底搞明白,结果从百度到google.com最后才在终于找到这么一篇讲解详细的英文文章,可怜我4级都没过的英语啊... 这是英文原文地址:http://veelck.wordpress.com/2008…
最近一直在温习旧的知识,刚好学习了一下Java的线程安全方面的知识,今天想起之前一直做的Delphi开发,所以还是有必要温习一下,看看这些不同的编程语言有什么不同之处. Delphi的线程同步方法: 1.临界区 申明一个临界资源 FLock   : TRTLCriticalSection; 先初化一个临界资源对象InitializeCriticalSection(FLock)销毁临界资源对象DeleteCriticalSection(FLock) procedure TSaveThread.Pu…
更详细的可以参考:http://www.cnblogs.com/xumenger/p/4450659.html 或者参考之后的博客 四个系统内核对象(事件.互斥.信号.计时器)都是线程同步的手段,从这也能看出处理线程同步的复杂性:不过这还不是全部,Windows Vista开始增加了 Condition variables(条件变量).Slim Reader-Writer Locks(读写锁)等同步手段. 不过最简单.最轻便(速度最快)的同步手段还是 CriticalSection(临界区),但…
Q1: 多线程中需避免多个线程同时向全局变量进行写入操作,导致访问冲突问题. A1:  可以通过使用加锁机制(比如:临界区.互斥.信号量)解决此问题. Q2:多线程中对于结构体和CLASS类型的全局变量是需要进行加临界区机制来实现数据同步 A2: 注意:临界区只有在所有的线程都使用它来访问全局内存时才起作用,如果有线程直接调用内存,而不通过临界区,也会造成同时访问的问题.临界区主要是为实现线程之间同步的,但是使用的时候要注意,一定要在使用临界区同步的线程之外建立该临界区(一般在主线程中定义临界区…
opener 属性是一个可读可写的属性,可返回对创建该窗口的 Window 对象的引用…
在Delphi  多线程中出现“尚未调用CoInitialize错误”的解决方法 解决方法如下: function  TMyThread.ExecTimer: Boolean;begin  Result := False ;  FMyThreadExecfinish := False;  Screen.Cursor := crHourGlass;  CoInitialize(nil); // 一定要加上此行代码  try    TranspondClientBaseData_factory1(H…
1.在窗体中创建dataGridView显示表: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { publ…
第七节:在多个线程时空中,把各自的代码塞到一个指定的线程时空运行     以 Ado 为例,常见的方法是拖一个 AdoConnection 在窗口上(或 DataModule 中), 再配合 AdoQuery ,DataSoure, DbGrid 等,就可以实现数据库的访问操作. 这种方式,可以理解为在主线程时空中访问数据库. 如果某一个查询或更新操作耗时较长,那么,界面将会假死.   1.在线程时空中访问数据库   其实,上文中提到的这个 AdoConnection 不单只能在主线程时空中访问…
我们面试中经常会被问到多线程相关知识,这一块内容往浅了说大家都会,但是一问到底层实现原理,我们往往就一脸懵逼. 这段时间准备好好学习多线程,接下来会写一系列关于多线程的知识. 我们首先要了解线程,百度百科这么介绍:线程(thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 这句话很好理解.一般我们不创建 thread 类的话,程序都是单线程在执行. 线程是…
为了启用属性,使用上面描述的方法.针对所有的用户,属性每一个访问的页面,将会在你的应用服务器中进行记录,直到你对 Confluence 进行重启.请注意每次用户访问一个链接,一个单一的属性将会被打印出来. 确定属性已经被写入到 Confluence 的日志文件中 —— 请参考 Working with Confluence Logs 页面中的内容,来对写入的日志文件和细节进行定位. 对不正常的访问缓慢确定这个问题出现的时间. 拷贝属性中的操作.为了确定哪些属性日志需要进行拷贝的时候,查找相应时间…
建议147:重构多个相关属性为一个类 若存在多个相关属性,就应该考虑是否将其重构为一个类.查看如下类: class Person { public string Address { get; set; } public string ZipCode { get; set; } public string Mobile { get; set; } public string Hotmail { get; set; } //其他省略 } 上面代码中的这四个属性全部跟联系方式有关,所以,我们应该重构一…
from:https://blog.csdn.net/poxiaohai2011/article/details/27555951 //C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址) using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using System.Collections;namespace Silverl…
关于MySQL的TinyInt数据类型在Delphi中作为Boolean类型的一个要注意的问题: 在定义TinyInt类型字段时,若要作为Delphi中作为Boolean类型,则该字段的长度必须为1!…