//这是关闭程序前释放线程部份,就这里一点这个按键程序就挂了,死了,不动了
procedure TFRMMain.BitBtn8Click(Sender: TObject);
begin
AThread.Terminate;
AThread.WaitFor;
AThread.Free;
application.Terminate;
end;下面是有关的线程创建,启动调用,
procedure TFRMMain.FormShow(Sender: TObject);
begin
aThread:=TMyThread.Create(True);//在界面显示时创建线程
end;procedure TFRMMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
str:=str+pchar(buffer);
if bufferlength<2048 then
begin
aThread.Resume;//在串口数据接收完后启动线程
end;
end;procedure TMyThread.Execute(); //执行线程
begin
while not terminated do
begin
........//这里是接收到串口数据解析和显示到listview1的代码部份,因为比较多,为了看方便,我这里就删除了
end;
sleep(10);
end;
end;
procedure TFRMMain.BitBtn8Click(Sender: TObject);
begin
AThread.Terminate;
AThread.WaitFor;
AThread.Free;
application.Terminate;
end;下面是有关的线程创建,启动调用,
procedure TFRMMain.FormShow(Sender: TObject);
begin
aThread:=TMyThread.Create(True);//在界面显示时创建线程
end;procedure TFRMMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
str:=str+pchar(buffer);
if bufferlength<2048 then
begin
aThread.Resume;//在串口数据接收完后启动线程
end;
end;procedure TMyThread.Execute(); //执行线程
begin
while not terminated do
begin
........//这里是接收到串口数据解析和显示到listview1的代码部份,因为比较多,为了看方便,我这里就删除了
end;
sleep(10);
end;
end;
解决方案 »
- 【急急急】关于页面中用LabeledEdit接收用户输入的数据如何验证输入的是数字而不是非数字字符问题???【急急急】
- 救急!!高手请进DBGRIDEH安装问题!
- 请问各位高人,DBlookupcombobox字段如何插入一空行?谢谢!
- 一个简单的问题
- 图片可以剪切板到image里吗?
- ClientSocket往ServerSocket发送流为什么会出错??????
- 谁有多余的QQ号啊?急需啊
- 再问一个小问题,在Delphi中如果跳出过程,用什么语句?分数不多但很容易得,快来抢分啊
- 请问如何在delphi中声明自定义数据类型?
- 大家快看,中美网络大战有动静了。
- delphi中的冒号问题
- delphi 把数据库的数据存储在xml里
直接在OnReceiveData处理就可以了
執行完AThread.Terminate;跟蹤 AThread的terminated屬性是否為True...
可以简化代码测试
begin
........//这里是接收到串口数据解析和显示到listview1的代码部份,因为比较多,为了看方便,我这里就删除了
end; 这里面也有循环吧。最好也能过判断terminated来退出内循环。
在停止时只执行 AThread.Terminate 这一句。在TMyThread.Execute()最后一句用 postmessage 给主窗体发送消息,或在线程的onTerminate 事件中给主窗体发消息,通知线程结束了。
然后在free和退出。
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TMyThread=class;
TForm1 = class(TForm)
btnStopThread: TButton;
btnRunThread: TButton;
procedure FormShow(Sender: TObject);
procedure btnStopThreadClick(Sender: TObject);
procedure btnRunThreadClick(Sender: TObject);
private
{ Private declarations }
aThread: TMyThread; public
{ Public declarations }
end; TMyThread=class(TThread)
private
procedure doJob;
protected
procedure Execute;override;
end;
var
Form1: TForm1;
FIsRun:Boolean;
implementation{$R *.dfm}{ TMyThread }procedure TMyThread.Execute;
begin
inherited;
while not Terminated do
begin
if (Terminated=True) and (FIsRun=False) then
begin
Terminate;
end;
doJob;
end;
end;procedure TForm1.FormShow(Sender: TObject);
begin
aThread:=TMyThread.Create(True);
end;procedure TForm1.btnStopThreadClick(Sender: TObject);
begin
FIsRun:=False;
end;procedure TMyThread.doJob;
begin
while true do
begin
//这里也可以进行循环检测 terminated标识
end;
end;procedure TForm1.btnRunThreadClick(Sender: TObject);
begin
aThread.Resume;
FIsRun:=True;
end;end.