Delphi XE6 使用定时器或者线程解决程序界面无响应问题
---恢复内容开始---
介绍
在手机应用上,我们不应该使用速度慢的代码,当然我们在桌面程序上也应该避免这个,当手机应用长时间没有相应的时候,程序会提示“程序没响应,是否关闭”的提示,这个非常不好,所以我们需要来解决这个问题。
下面是一个普通代码,通过for来循环添加ListVIew行,代码很简单,大家都见过
var
I: Integer;
Total: Integer;
begin
// counts the prime numbers below the given value
Total := ;
for I := to MaxValue do
begin
if (I * mod MaxValue) = then
ListView1.Items.Add.Text := 'B: ' + I.ToString;
if IsPrime (I) then
Inc (Total);
end;
ListView1.Items.Add.Text := 'Blocking: ' + Total.ToString;
复制代码
在运行过程中,程序是无响应的,屏幕更本不刷新,直到运行结束,但是这里有个问题,MaxValue如果少还行,如果数值比较大,那么我们就会看到如下的界面

提示了程序没有响应,是否需要关闭它,这显示是个大问题,我们需要来解决。
解决这个问题可以通过定时器或者线程,但是相比线程,定时器差很多,如果代码比较复杂,还是可能会出现上面的问题,目前解决UI无法响应,真正的解决方法还是通过线程的方法,实现线程当然是非常简单,但是也需要注意,在更新UI的时候,需要使用“synchronize”。
procedure TForm5.Button3Click(Sender: TObject);
begin
TThread.CreateAnonymousThread(procedure ()
var
I: Integer;
Total: Integer;
begin
Total := ;
for I := to MaxValue do
begin
if (I * mod MaxValue) = then
TThread.Synchronize (TThread.CurrentThread,
procedure ()
begin
ListView1.Items.Add.Text := 'Th: ' + I.ToString;
end); if IsPrime (I) then
Inc (Total);
end; TThread.Synchronize (TThread.CurrentThread,
procedure ()
begin
ListView1.Items.Add.Text := 'Thread: ' + Total.ToString;
NotifyComplete;
end);
end).Start;
end;
当启动线程后,程序没有出现无响应的问题,或者更本不会发生什么。

Delphi XE6 使用定时器或者线程解决程序界面无响应问题的更多相关文章
- delphi xe6 窗口 visible 不能隐藏 解决
delphi xe6 窗口 visible 不能隐藏 解决 在工程代码里面加上 Application.ShowMainForm := false;
- Ubuntu16.04 下的网易云出现网络异常、无法播放,界面无响应问题的统一解决
能够在Linux系统下体验到原生界面的网易云音乐是件不错的事情,但是它总是经常性的出现网络异常,界面无响应的问题 为了听歌的体验,进行深入探究: 首先通过终端启用网易云音乐:sudo netease- ...
- Win8/Win10下程序经常无响应的解决办法
如果你使用Win8/Win10系统时经常出现程序无响应的问题不仿试下如下解决办法. 表现症状: 任何程序都有可能出现无响应(记事本.Visual Studio.QQ.视频播放器等) 一旦一个程序出现未 ...
- DELPHI实现类似仿360桌面的程序界面
1.窗体半透明: Alphablend属性为true;Alphablendvalue的值为100 2.窗体透明: formCreate: Self.TransparentColor := True;S ...
- 解决 OnDropFiles 可能无响应的问题【转】
大多数程序都有接收拖放文件的功能,即是用鼠标把文件拖放到程序窗口上方,符合格式的文件就会自动被程序打开.最近自己对编写的程序增加了一个拖放文件的功能,在 Windows XP.Windows Serv ...
- Windows程序卡顿、无响应问题定位
当windows程序出现异常.界面卡顿.无响应情况时,在有工程和源码的情况下,程序员通常是打开IDE,在DEBUG模式下进行调试.但如果是一个RELEASE程序,且无调试环境,该如何来定位呢. 这里介 ...
- 谈.Net委托与线程——解决窗体假死
转自:http://www.cnblogs.com/smartls/archive/2011/04/08/2008981.html#2457370 引言 在之前的<创建无阻塞的异步调用> ...
- Delphi XE6 试用Android视频采集
FMX支持视频采集,具体见FMX.Media,提供了很类支持音频.视频的处理. 按帮助文档,用Note3做了测试,结果,效率太低,不可用. 具体可查询帮助Video Capturing一节,我就是按这 ...
- Delphi 实现多线程编程的线程类 TThread
http://blog.csdn.net/henreash/article/details/3183119 Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉 ...
随机推荐
- BZOJ 2064: 分裂 状压动归
最多的操作次数是 $n+m-1$ (相当于把第一个暴力合并,再暴力拆成第二个).如果第一个序列的一个子序列和第二个区间的子序列相等,那么总次数就可以减 $2$.将第二个序列所有数取反,直接求解有多少个 ...
- Linux学习建议[转]
端正学习态度学linux不会为了当黑客或者骇客,如果你为了当黑客或骇客而学习Linux,那么你离进监狱不远了,只是时间早晚而已.很多小白都知道“黑客攻击工具”很多来源与Linux平台上的,我也曾指导过 ...
- P1894 [USACO4.2]完美的牛栏The Perfect Stall
题目描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在 ...
- c++和cuda混合编程 实现传统神经网络
直接放代码了... 实现的是x1+x2=y的预测,但梯度下降很慢...233333,gpu运行时间很快!! // // main.cpp // bp // // Created by jzc on 2 ...
- setitimer()函数
定时器时间函数 struct itimerval: struct itimerval *new_value,其定义如下: struct itimerval { struct timeval it_in ...
- fork()函数 图解
code #include<stdio.h> #include <getopt.h> #include<iostream> #include<string&g ...
- 浅析python-socket编程
1. 什么是socket? socket是套接字的英文名称, 我们知道在TCP/IP协议簇体系中,将网络状态分为了应用层.传输层.网络层.物理层等四种状态,而socket是与传输层密切相关的,其主要实 ...
- 用vue做的购物车结算的功能
<!-- 占位 --> <template> <div> <div class="product_table"> <div c ...
- URLEncoder.encode 使用心得
1.解决接口GET请求中:参数包含中文问题? 通过URLEncoder.encode 可以解决.我此次使用的utf-8编码,所以对中文进行urlencode 编码 而在服务器短 使用的tomcat ...
- JWT签名算法
JWT签名算法 JWT签名算法中,一般有两个选择,一个采用HS256,另外一个就是采用RS256. 签名实际上是一个加密的过程,生成一段标识(也是JWT的一部分)作为接收方验证信息是否被篡改的依据. ...