Delphi4技术内幕中提到  Delpih VCL线程是不安全的 要在线程中调用VCL的方法可以用TThread类实现

TThread有两个好处

1.提供了Synchronize函数,可以从一个线程中调用VCL

2.它提共了线程局部存储器(thread local storeage)

SynChronize 是TThread中的一个方法,可以用它封装对要调用VCL方法的调用

Delphi Help里有例子

This example shows how to call a button抯 click method in a thread-safe manner:

procedure TMyThread.PushTheButton;

begin
  Button1.Click();
end;

procedure TMyThread.Execute;
begin
...
  Synchronize(PushTheButton);
  ...
end;

这是唯一一个能在线程中调用VCL的方法,作用:使线程临时成为应用主程序的一部分

当一个程序在线程中不能访问VCL,解决的方法:SynChronize(ThreadMethod);

unit Unit3;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTMainForm = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;TMyThread = class(TThread)protectedprocedure execute;overload;procedure CallVclMethod;end;varMainForm: TMainForm;implementationuses Unit4;{$R *.dfm}{ TMyThread }procedure TMyThread.CallVclMethod;
beginChildForm := TChildForm.Create(Application);ChildForm.Show;ChildForm.Update;
end;procedure TMyThread.execute;
beginSynchronize(CallVclMethod);
end;procedure TMainForm.Button1Click(Sender: TObject);
varMyFunc:TMyThread;
beginMyFunc := TMyThread.Create(false);MyFunc.execute;MyFunc.Free;
end;end.

实际作用是暂时结束当前线程,并使它成为你应用程序中的一部分,在这段时间内就可调用VCL方法,当结束访向VCL后,中断程序中同步代码

SynChronize使线程与应程程序具有同步性

转载于:https://www.cnblogs.com/pengshao/archive/2011/04/16/2018457.html

delphi——用线程创建一个窗体笔记相关推荐

  1. Windows编程第一课:纯手工创建一个窗体

    第一节 创建应用程序主窗体 1 创建消息处理函数 LRESULT CALLBACK fWinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPara ...

  2. C#多线程与UI响应 防止界面假死不响应(子线程创建的窗体获取消息响应用Application.DoEvent )

    一. 概述 在使用C#进行应用程序设计时,经常会采用多线程的方式进行一些后台任务的工作.对于不同的应用场景,使用的策略也不尽相同. 1. 后台循环任务,少量UI更新:例如批量上传文件,并提供进度.这种 ...

  3. 利用线程池为线程创建一个守护线程

    主线程: public class MainThread implements Callable {SimpleDateFormat sdf =new SimpleDateFormat("y ...

  4. Java实训——创建一个窗体程序,实现简单的数学加、减法测试。

    实训要求: 代码: MainClass类: public class MainClass {/*** @param args*/public static void main(String[] arg ...

  5. 我的Go语言学习之旅七:创建一个GUI窗体

    在上次中,刚刚学过了  弹窗效果,这里再接着学习一下如何创建一个窗体. 还是老路子,先上代码: package mainimport ( "github.com/lxn/go-winapi& ...

  6. Eric6最简单的应用(创建一个项目-窗体-编译-运行)

    1.创建项目 2.创建一个窗体 自动弹出Qt designer 工具,可视化窗体界面: 创建一个关闭按钮,关闭这个窗体: 保存后,选择ui文件,进行编译ui文件: 然后执行该脚本,即可: 以上是eri ...

  7. Delphi Thread 线程(1)

    Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到, 但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synch ...

  8. 纯C++创建Windows窗体(理解WinMain()与WndProc())

    一直比较关注本质的东西.VC封装了很多,想了解一下比较麻烦. 先从了解WinMain()入口函数与WndProc()消息处理函数开始吧. 大气象 #include <windows.h> ...

  9. 用java创建一个最简单的窗口

    如何使在创建窗体前,需要导入相关的 ​package​ 包. import java.awt.*; import javax.swing.*; 使用​new​关键词来创建一个窗体对象 JFrame j ...

最新文章

  1. NodeJS加MongoDB应用入门
  2. CascadePSP 测试笔记
  3. 开机出现grub rescue无法进入系统 恢复ubuntu系统下grub引导 windows xp和ubuntu9.10双系统引导程序的修复
  4. 学习笔记(七)——jQuery(一)
  5. ML之回归预测:机器学习中的各种Regression回归算法、关键步骤配图
  6. 案例 | 撇开虚荣指标,如何策划一场成功的拉新活动?
  7. 你当真了解count(*)count(id)count(1)吗?
  8. [Leedcode][JAVA][第9题][回文数][数学法]
  9. 网络管理不简单 需化被动为主动
  10. kafka--Struct Streaming--kafka案例
  11. ie剪切增强版工具---自由填表工具filltable
  12. linux 查看vcf文件,转载-VCF格式详解
  13. 今天是我的生日,也是我的离职日!
  14. TCP,UDP,IP,数据链路层头部详解
  15. 美颜SDK架构技术分析
  16. 计算机硬件未来发展前景,计算机硬件发展现状
  17. 基于乾坤的微前端+SpringBoot2.7整套解决方案的基础通用平台及组件
  18. 4G LTE各band对应的频率一览表
  19. SAS卡,RAID卡,HBA卡区别与联系
  20. yii2框架 电商系统在线直播开发

热门文章

  1. php双分支语句【三个数排序】
  2. 判断当前时间是否在某个时间范围内
  3. kubectl技巧之查看资源列表,资源版本和资源schema配置
  4. 连号区间数(2013年第四届c/c++ b组第10题)
  5. 2018.07.11 线段树基本模板复习
  6. 基本数据类型(列表,元祖,字典,集合)
  7. seajs打包部署工具spm的使用总结
  8. sqlserver中查找长时间未提交事务
  9. 设置progressbar进度条颜色
  10. 【Demo 0121】纯资源DLL中提取资源