刚学线程,有些问题不懂啊,上次做了个串口通信的东西,很多不懂, hch_45(HCH ~ahong.net~)帮我解决了不少问题,在此感谢了。但是还有一些问题请教。
comm1是在线程里创建的,
但我要在主form里设置一个radiogroup和一个buttom,用来选择并打开通讯端口,请问怎么做?我自己搞了一个,但是我发现运行后,耗的内存不断增加,cpu使用率也一直是100%
,请哪位高手就我这个问题做个详细解答,感激不尽啊。我的程序如下: 主form:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, TComm1,Unit2;type
TForm1 = class(TForm)
rdcom: TRadioGroup;
Button2: TButton;
Memo2: TMemo;
Button3: TButton;
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
implementation{$R *.dfm}
procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
readthread:=treadthread.create(false);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
readthread.Free;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
readthread.opens;
end;end.
线程:
unit Unit2;interfaceuses
Classes,tcomm1;type
treadthread = class(TThread) procedure opens ;
private
comm1:tcomm;
temp:string;
procedure readport;
protected
procedure Execute; override;
end;
var
readthread:treadthread;implementationuses unit1;
procedure treadthread.Execute;
begin
comm1:=tcomm.create(nil); try
while not terminated do
begin
temp:=comm1.input;
synchronize(readport);
end;
finally
comm1.free;
end;
end;procedure treadthread.readport;
begin
form1.Memo2.Text:=temp;
end;procedure treadthread.opens;
begin
case form1.rdcom.ItemIndex of
0:comm1.commport:=pncom1;
1:comm1.CommPort:=pncom2;
end;
comm1.PortOpen:=true;
end;
end.
comm1是在线程里创建的,
但我要在主form里设置一个radiogroup和一个buttom,用来选择并打开通讯端口,请问怎么做?我自己搞了一个,但是我发现运行后,耗的内存不断增加,cpu使用率也一直是100%
,请哪位高手就我这个问题做个详细解答,感激不尽啊。我的程序如下: 主form:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, TComm1,Unit2;type
TForm1 = class(TForm)
rdcom: TRadioGroup;
Button2: TButton;
Memo2: TMemo;
Button3: TButton;
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
implementation{$R *.dfm}
procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
readthread:=treadthread.create(false);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
readthread.Free;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
readthread.opens;
end;end.
线程:
unit Unit2;interfaceuses
Classes,tcomm1;type
treadthread = class(TThread) procedure opens ;
private
comm1:tcomm;
temp:string;
procedure readport;
protected
procedure Execute; override;
end;
var
readthread:treadthread;implementationuses unit1;
procedure treadthread.Execute;
begin
comm1:=tcomm.create(nil); try
while not terminated do
begin
temp:=comm1.input;
synchronize(readport);
end;
finally
comm1.free;
end;
end;procedure treadthread.readport;
begin
form1.Memo2.Text:=temp;
end;procedure treadthread.opens;
begin
case form1.rdcom.ItemIndex of
0:comm1.commport:=pncom1;
1:comm1.CommPort:=pncom2;
end;
comm1.PortOpen:=true;
end;
end.
begin
readthread:=treadthread.create(false);---->>true
多加一行:readthread.freeonterminated:=true;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
readthread.Free;------->>readthread.terminate;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
readthread.opens;------------>>readthread.resume;
end;
begin
case form1.rdcom.ItemIndex of
0:comm1.commport:=pncom1;
1:comm1.CommPort:=pncom2;
end;
comm1.PortOpen:=true;
end;
虽然是在线程中定义的,但是函数永远是资源,哪个线程调用它,她才再哪个线程里面执行。
你再button2 click的时候调用它,而button2click是主线程调用的,opens自然再主线程中运行。 while not terminated do
begin
temp:=comm1.input;<<============这个是阻塞的么?即便是阻塞,那么它里面有没有耗时很短的循环呢?这就是cpu 使用率居高不下的原因。
synchronize(readport);
end;
finally
comm1.free;
end;
msg:tmsg;
begin
while not terminated and getmessage(msg,....) do//这样由于getmessage是阻塞的,就是线程队列没有消息就不返回,而你再主线程里面用postthreadmessage代替readthread.resume来控制工作线程多好。
begin
temp:=comm1.input;
synchronize(readport);
end;
finally
comm1.free;
end;