type readcomm=Class(TThread) private com:string;//对应的串口号 hd:THandle;//对应的串口句柄 msg:AnsiString;//接收到的所有未处理的报文 bw:string;//一条完整的报文 id:Integer;//序号 header,code,Len_bw,mss:string; time:TTimer; protected procedure execute;override; procedure showbw; public function resolveheader:Boolean; function resolvecode:Boolean; function resolvemsg:Boolean; end; procedure readcomm.execute; var s:string; inbuff:array[1..2048] of Char; nBytesRead,dwError,lrc: LongWORD; cs:TCOMSTAT; i:Integer; begin time:=TTimer.Create(Application); time.Name:='timer1'; ................ end;
starluck 谢谢你 能给出点代码看看嘛 不懂你说的
大家看看这个代码 为什么就是没效果呢? 谢谢了unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure timeron(Sender:Tobject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; implementation{$R *.dfm} type Tmythread = class(Tthread) private timer: TTimer; protected procedure Execute;override; end; procedure TForm1.Button1Click(Sender: TObject); begin tmythread.Create(false); end;{ Tmythread }procedure Tmythread.Execute; var i:integer; begin inherited; freeonterminate:=true; timer:=TTimer.Create(Application); timer.Enabled:=true; timer.OnTimer:=form1.timeron; for i:=0 to 500000 do begin with form1.Canvas do form1.Canvas.Lock; form1.Canvas.TextOut(10,10,inttostr(i)); form1.Canvas.Unlock; end; end;procedure TForm1.timeron(Sender: Tobject); begin showmessage('dfdf'); end;end.
//看来白说了 1.Thread Classunit Unit2;interfaceuses Classes,ExtCtrls,dialogs,Windows;type TMyTest = class(TThread) private FTimer:TTimer; procedure TimerProc(Sender: TObject); protected procedure Execute; override; public constructor create; destructor Destroy; override; end;implementation constructor TMyTest.Create; begin Inherited Create(true); end;destructor TMyTest.Destroy; begin inherited; end;procedure TMyTest.Execute; var Msg: TMsg; begin FTimer:=TTimer.Create(nil); try FTimer.Enabled:=True; FTimer.Interval:=5000 ; FTimer.OnTimer:=TimerProc; while GetMessage(Msg, 0, 0, 0) do begin TranslateMessage(Msg); DispatchMessage(Msg) end; Terminate; finally FTimer.Free; end; { Place thread code here } end;procedure TMyTest.TimerProc(Sender: TObject); begin //to do showmessage('ok'); end;end.2.调用 Myclassprocedure TForm1.btn1Click(Sender: TObject); var Mytest:TMyTest; begin Mytest:=TMyTest.create; Mytest.Resume; end;
procedure Tmythread.Execute; var i:integer; begin inherited; freeonterminate:=true; timer:=TTimer.Create(Application); timer.Enabled:=true; timer.OnTimer:=form1.timeron; for i:=0 to 500000 do begin with form1.Canvas do form1.Canvas.Lock; form1.Canvas.TextOut(10,10,inttostr(i)); form1.Canvas.Unlock; end; end; 1. 如果你想創建一個主線程來維護的TIMER你就直接在線程的 Create 裏建立這個TIMER;2 .如果你想這個TIMER屬於你剛建立的這個線程的話,就建立在EXCUTE下,在VCL線,線程的Execute 是真正由線程來執行的。
timer.name:='timer1';
timer.interval:=1000;
timer.ontime:=self.timetimer;
在别的里面定义有用不了;
type
MyThread = Class(Thread)
priavate
FTimer : TTimer;
public
Procedure Execute;
end;這樣的。一般我建議你自己建立一個消息循環來維護TIMER的消息隊列。
1.
如果使用VCL封装的线程类的话,创建TTimer时一定要在其Execute中创建,不能在线程Create中创建!
从API的角度来说,Timer应该创建至ThreadFunc中,否则WM_TIMER消息将会被投掷到主线程的消息队列中
2.
在线程中维护一个消息队列,用来接收WM_TIMER消息以及退出TIMER计时器
uses
ExtCtrls
Tmythread = class(Tthread)
priavate
timer: TTimer;//写在这 在线程里能看到TTimer 但是编译的时候 提示错误
protected
procedure Execute;override;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
tmythread.Create(false);
end;{ Tmythread }procedure Tmythread.Execute;
var i:integer;
begin
inherited;
freeonterminate:=true;
timer:=TTimer.Create(/这里该写什么/);
不是同你說了嗎,TIMER如果放在線程裏,消息的隊列應該由自己來維護,不要交給主線程,那不亂套,還有什麼線程可言。
type
readcomm=Class(TThread)
private
com:string;//对应的串口号
hd:THandle;//对应的串口句柄
msg:AnsiString;//接收到的所有未处理的报文
bw:string;//一条完整的报文
id:Integer;//序号
header,code,Len_bw,mss:string;
time:TTimer;
protected
procedure execute;override;
procedure showbw;
public
function resolveheader:Boolean;
function resolvecode:Boolean;
function resolvemsg:Boolean;
end;
procedure readcomm.execute;
var
s:string;
inbuff:array[1..2048] of Char;
nBytesRead,dwError,lrc: LongWORD;
cs:TCOMSTAT;
i:Integer;
begin
time:=TTimer.Create(Application);
time.Name:='timer1';
................
end;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure timeron(Sender:Tobject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
implementation{$R *.dfm}
type
Tmythread = class(Tthread)
private
timer: TTimer;
protected
procedure Execute;override;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
tmythread.Create(false);
end;{ Tmythread }procedure Tmythread.Execute;
var i:integer;
begin
inherited;
freeonterminate:=true;
timer:=TTimer.Create(Application);
timer.Enabled:=true;
timer.OnTimer:=form1.timeron;
for i:=0 to 500000 do
begin
with form1.Canvas do
form1.Canvas.Lock;
form1.Canvas.TextOut(10,10,inttostr(i));
form1.Canvas.Unlock;
end;
end;procedure TForm1.timeron(Sender: Tobject);
begin
showmessage('dfdf');
end;end.
1.Thread Classunit Unit2;interfaceuses
Classes,ExtCtrls,dialogs,Windows;type TMyTest = class(TThread)
private
FTimer:TTimer;
procedure TimerProc(Sender: TObject); protected
procedure Execute; override;
public
constructor create;
destructor Destroy; override;
end;implementation
constructor TMyTest.Create;
begin
Inherited Create(true);
end;destructor TMyTest.Destroy;
begin inherited;
end;procedure TMyTest.Execute;
var
Msg: TMsg;
begin
FTimer:=TTimer.Create(nil);
try
FTimer.Enabled:=True;
FTimer.Interval:=5000 ;
FTimer.OnTimer:=TimerProc;
while GetMessage(Msg, 0, 0, 0) do begin
TranslateMessage(Msg);
DispatchMessage(Msg)
end;
Terminate;
finally
FTimer.Free;
end;
{ Place thread code here }
end;procedure TMyTest.TimerProc(Sender: TObject);
begin
//to do
showmessage('ok');
end;end.2.调用 Myclassprocedure TForm1.btn1Click(Sender: TObject);
var
Mytest:TMyTest;
begin
Mytest:=TMyTest.create;
Mytest.Resume;
end;
var i:integer;
begin
inherited;
freeonterminate:=true;
timer:=TTimer.Create(Application);
timer.Enabled:=true;
timer.OnTimer:=form1.timeron;
for i:=0 to 500000 do
begin
with form1.Canvas do
form1.Canvas.Lock;
form1.Canvas.TextOut(10,10,inttostr(i));
form1.Canvas.Unlock;
end;
end;
1. 如果你想創建一個主線程來維護的TIMER你就直接在線程的 Create 裏建立這個TIMER;2 .如果你想這個TIMER屬於你剛建立的這個線程的話,就建立在EXCUTE下,在VCL線,線程的Execute 是真正由線程來執行的。
如果你選擇第二個就用 liangPei2008 的方法。
但我不知道你為什麼一定要線程跟UI掛上關系。