估计你在readdb中循环操作数据库,如果是这样的话当然是执行不到Timer.OnTime了,所以不管你在ontime中怎么更新Edit的值,根本没有执行到怎么会去更新呢!建议:在readdb的循环中加入Application.ProcessMessages; 如: while ... do begin ... ... Application.ProcessMessages; end; 保证可以!!!
你将timer的周期时间设置长于6秒试试,!给你一段我的简单线程例子! unit ThreadData;interfaceuses Windows,Classes, SysUtils;type TReadThread = class(TThread) private { Private declarations } procedure ReadPort; //读取串行端口数据 protected procedure Execute; override; end;implementation uses mainform; // 声明引用mainform,必须放在implementation区段procedure TReadThread.Execute; begin { Place thread code here } While not Terminated do begin Synchronize(ReadPort);//刚才所定义的读取数据函数 end; end;//读取串行端口的程序放在这里 procedure TReadThread.ReadPort; var Temp : string; inbuff: array[0..2047] of Char; nBytesRead, dwEvent, dwError:LongWORD ; cs:TCOMSTAT; begin if (fm_main.Comm1.Hcomm=0) then exit;//先判断是否已打开通信端口 ClearCommError(fm_main.Comm1.Hcomm,dwError,@CS); //取得状态 ReadFile(fm_main.Comm1.Hcomm, inbuff,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据 //串行在读取数据后,会自动将缓冲区中已被读取的数据清除掉 if cs.cbInQue =0 then exit; // 数据是否大于我们所准备的Buffer if cs.cbInQue > sizeof(inbuff) then begin PurgeComm(fm_main.Comm1.Hcomm, PURGE_RXCLEAR); // 清除COM 数据 exit; end; //Temp:=Copy(inbuff,1,cs.cbInQue);//取出数据 temp:=fm_main.Comm1.GetCommData; fm_main.BarCode01.Caption:=temp; end; end.
哪位老大给个开两线程显示的程序吧,另开贴给200分,决不食言 Program Files\Borland\Delphi7\Demos\Threads 这个没看懂
那Timer是解决不了这个问题的,因为这回使得数据覆盖的问题出现,或者未完成中断! //线程函数 function ThreadFunc(P:Pointer):LongInt;Stdcall; var i:integer; DC:HDC; S:String; begin DC:=GetDC(Form1.Handle); For I:=0 to 100000 do begin S:=InttoStr(I); TextOut(DC,10,10,Pchar(S),Length(S)); end; ReleaseDc(Form1.handle,DC); end; //声明使用 var hThread:THandle; ThreadID:DWord; begin CreateThread(nil,0,@ThreadFunc,nil,0,ThreadID); //。 end; 关于CreateThread的参数 第一个参数代表一系列安全属性,如果这个参数是nil,将会使用默认的安全属性,在98/95下使用这个属性是标准用法,如果你想让子进程继承这个线程的时候,可以改变这个属性,具体使用查看win32帮助文件中的SECURITY_ATTRIBUTES 第二个参数是0的话,线程堆栈的大小和应用程序的堆栈大小是一样的, 第三个参数是最重要的部分,它是你指定在线程开始运行时调用的线程函数的名称的地方,只要在这个域中输入函数名称,并且在前面加个@(表示函数地址)就可以了。 第四个参数是向函数传递参数,使用方法大概是先创建一个结构,然后把地址传递到这个参数中。 第五个参数是关于线程的标志,例如可挂起线程,Creates_USPENDED 第六个参数是表示系统分配给它的唯一的ID
当然,通常情况这样子可以解决问题,但是有时候却不可以使用。具体的问题具体分析吧。
Application.ProcessMessage;
readdb();
timer1.Enabled:=false;
self.refresh;
试试,如果可以的话,请楼主至少给我80分!
记得!
如:
while ... do
begin
...
...
Application.ProcessMessages;
end;
保证可以!!!
不知道楼主是要用来具体做一个什么功能,如果是用来显示进度状态,TStatusBar或者TStaticText。
readdb();就是一个单个的存储过程,执行时间大概要6秒这样子
unit ThreadData;interfaceuses
Windows,Classes, SysUtils;type
TReadThread = class(TThread)
private
{ Private declarations }
procedure ReadPort; //读取串行端口数据
protected
procedure Execute; override;
end;implementation
uses mainform; // 声明引用mainform,必须放在implementation区段procedure TReadThread.Execute;
begin
{ Place thread code here }
While not Terminated do
begin
Synchronize(ReadPort);//刚才所定义的读取数据函数
end;
end;//读取串行端口的程序放在这里
procedure TReadThread.ReadPort;
var
Temp : string;
inbuff: array[0..2047] of Char;
nBytesRead, dwEvent, dwError:LongWORD ;
cs:TCOMSTAT;
begin
if (fm_main.Comm1.Hcomm=0) then exit;//先判断是否已打开通信端口
ClearCommError(fm_main.Comm1.Hcomm,dwError,@CS); //取得状态
ReadFile(fm_main.Comm1.Hcomm, inbuff,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据
//串行在读取数据后,会自动将缓冲区中已被读取的数据清除掉
if cs.cbInQue =0 then exit;
// 数据是否大于我们所准备的Buffer
if cs.cbInQue > sizeof(inbuff) then begin
PurgeComm(fm_main.Comm1.Hcomm, PURGE_RXCLEAR); // 清除COM 数据
exit;
end;
//Temp:=Copy(inbuff,1,cs.cbInQue);//取出数据
temp:=fm_main.Comm1.GetCommData;
fm_main.BarCode01.Caption:=temp;
end;
end.
Program Files\Borland\Delphi7\Demos\Threads 这个没看懂
//线程函数
function ThreadFunc(P:Pointer):LongInt;Stdcall;
var
i:integer;
DC:HDC;
S:String;
begin
DC:=GetDC(Form1.Handle);
For I:=0 to 100000 do begin
S:=InttoStr(I);
TextOut(DC,10,10,Pchar(S),Length(S));
end;
ReleaseDc(Form1.handle,DC);
end;
//声明使用
var
hThread:THandle;
ThreadID:DWord;
begin
CreateThread(nil,0,@ThreadFunc,nil,0,ThreadID);
//。
end;
关于CreateThread的参数
第一个参数代表一系列安全属性,如果这个参数是nil,将会使用默认的安全属性,在98/95下使用这个属性是标准用法,如果你想让子进程继承这个线程的时候,可以改变这个属性,具体使用查看win32帮助文件中的SECURITY_ATTRIBUTES
第二个参数是0的话,线程堆栈的大小和应用程序的堆栈大小是一样的,
第三个参数是最重要的部分,它是你指定在线程开始运行时调用的线程函数的名称的地方,只要在这个域中输入函数名称,并且在前面加个@(表示函数地址)就可以了。
第四个参数是向函数传递参数,使用方法大概是先创建一个结构,然后把地址传递到这个参数中。
第五个参数是关于线程的标志,例如可挂起线程,Creates_USPENDED
第六个参数是表示系统分配给它的唯一的ID