高分求救~!串口线程问题!

suuare 2003-08-21 04:57:53
线程已经定义好了,关键是如何使用这个线程。
自己创建的单元如下:
unit ComThread;
interface
uses
Classes, OleCtrls, MSCommLib_TLB,Windows,StdCtrls,QForms,SysUtils;
type
TComThread = class(TThread)
private
{ Private declarations }
Com:TMscomm; ME:TMemo; procedure ComCRTro;
protected
procedure Execute; override;
published
constructor CreateIt(MSCOMM:TMSCOMM;Memo:Tmemo);
end;
implementation
uses ConThread_Test;
var strcall:String;

constructor TComThread.CreateIt(MSCOMM:TMSCOMM;Memo:Tmemo);
begin
inherited Create(True);
Priority:=TThreadPriority(tpTimeCritical);
FreeOnTerminate:=True;
Com:=MSCOMM;
ME:=Memo;
Suspended:=False;
end;

procedure TComThread.ComCRTro;
var t:Dword;
s,a:string;
i,v:Integer;
begin
t:=GetTickCount();
while GetTickCount-t<200 do
Application.ProcessMessages;
a:=Com.Input; //读入数据
s:=Trim(a);
if s<>'' then
ME.Lines.Add(s);
if pos('Income',s)<>0 then //如果收到有短消息返回指令
begin
Com.Output:='read';
end
else if pos('READ',s)<>0 then
begin
Com.Output:='delect';
end;
end;
procedure TComThread.Execute;
begin
Synchronize(ComCRTro);
end;
end.
为了能使用这个线程,我的应用程序如下:
在mscomm的onComm事件添加代码:
procedure TForm1.MSComm1Comm(Sender: TObject);
begin
if MSComm1.CommEvent=2 then
if Test=nil then
Test:=TComThread.CreateIt(mscomm1,memo1);
end;
我的目的是将每个来自串口的数据都add到memo1上去。但实验发现我错了
可能是使用现成的错误,可我错在哪里啊? 请大家帮忙!!
...全文
21 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
suuare 2003-08-22
  • 打赏
  • 举报
回复
progressbar的变化放在线程里并设定其优先级为最低就好了,
但progressbar仅仅是个例子。程序中如果有很多东西,比方adoquery,tmemo.......就是要给每个东西都加上线程么? 这样的话太烦琐了啊!
bluenightsky 2003-08-21
  • 打赏
  • 举报
回复
progressbar变化最好放在线程中
jpyc 2003-08-21
  • 打赏
  • 举报
回复
控件会自动创建线程的,所以你不必操心线程问题
jpyc 2003-08-21
  • 打赏
  • 举报
回复
http://218.56.11.178:8020/web/index.aspx

-> 下载基地->九品御厨作品-串口通讯控制器

http://218.56.11.178:8020/web/technology/chuangkou.htm
lxpbuaa 2003-08-21
  • 打赏
  • 举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
Application.ProcessMessages;
for i:=1 to 100000 do
Progressbar1.StepIt;
end;

你再看看行不行,如果还不行的话,可以将类似progressbar变化这样的工作放在线程里。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————

suuare 2003-08-21
  • 打赏
  • 举报
回复
progressbar的变化没有实际意义 就是想让它占用cpu看他能不能影响com的变化
我是想让com变化为最高级别 如果有com事件的话 别的可以先停下来 但一定要执行com的变化
改怎么改??
lxpbuaa 2003-08-21
  • 打赏
  • 举报
回复
哦,这样。那是当然,progressbar变化串口线程不会执行的。progressbar和串口线程的执行有什么关系吗?progressbar是表示什么东西的进度?

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
suuare 2003-08-21
  • 打赏
  • 举报
回复
是啊!看一下下面的程序...
unit ConThread_Test;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, MSCommLib_TLB, StdCtrls,Fun,ComThread, ComCtrls;

type
TForm1 = class(TForm)
MSComm1: TMSComm;
Memo1: TMemo;
Button1: TButton;
Label1: TLabel;
ProgressBar1: TProgressBar;
procedure FormShow(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure MSComm1Comm(Sender: TObject);
private
{ Private declarations }
Test:TComThread;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
opencom(Mscomm1,'1');
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
for i:=1 to 100000 do
Progressbar1.StepIt;
end;

procedure TForm1.MSComm1Comm(Sender: TObject);
begin
if MSComm1.CommEvent=2 then
if Test=nil then
Test:=TComThread.CreateIt(mscomm1,memo1);
end;

end.
原本设置的Priority:=TThreadPriority(tpTimeCritical);
最高级别的
可是当progressbar变化的时候 串口数据根本就add不了memo
帮帮我啊~~!
lxpbuaa(桂枝香在故国晚秋) 你有QQ 吗? 我的:42899786
lxpbuaa 2003-08-21
  • 打赏
  • 举报
回复
这个跟”做到comm事件第一“有关系吗?
”如果先做别的事情的话,它同样不会被激发的“又是什么意思?
难道MSComm1Comm没有被激发?

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
suuare 2003-08-21
  • 打赏
  • 举报
回复
还是那样.....
问题是在整个工程中怎样才能做到comm事件第一呢??
procedure TForm1.MSComm1Comm(Sender: TObject);
begin
if MSComm1.CommEvent=2 then
if Test=nil then
Test:=TComThread.CreateIt(mscomm1,memo1);
end;
如果先做别的事情的话,它同样不会被激发的.................
lxpbuaa 2003-08-21
  • 打赏
  • 举报
回复
对了,可能:
if Test=nil then是不对的。
FreeOnTerminate:=True;应该只是销毁Test,但是此后Test <> nil。可以去掉:
if Test=nil then
再看看。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
lxpbuaa 2003-08-21
  • 打赏
  • 举报
回复
“但实验发现我错了”
发现什么错了,看似没有大问题。

————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧