我做了一个多窗体多线程通讯程序,主线程用Mscomm定时收数据,一线程实现动态绘图(不止一条线),一线程用Socket实现局域网通讯。由窗体的OnCreate事件启动定时收数据,同时创建绘图线程,因为数据接收频率高,绘图不需要那么高频率,所以想到用定时器来定时唤醒绘图线程,为防止绘图线程一直运行(我试过),一次画完后我把绘图线程挂起,可是这样还是不行,线程挂不起来,一直在画。
各位帮我看看,该怎么改,(老板一定要用多线程做),
相关代码如下:
procedure TForm_show.FormCreate(Sender: TObject); //窗体产生
begin
.
.
Thread_Wen:=TDrawThread.Create(DrawGrid1,clRed,tpnormal,X1,Y1,X2,Y2);
end;procedure TForm_show.Timer_WenThrTimer(Sender: TObject); {温度线程启动}
begin
if ThrStart_Wen=1 then
begin
F_Wen:=StrToFloat(Edit_Wen.Text);
X1:=X2_Wen;
Y1:=Y2_Wen;
X2:=X1+Step_Wen;
Y2:=Y0-Round(scale_Wen*F_Wen);
X2_Wen:=X2;
Y2_Wen:=Y2;
Thread_Wen.Resume;
end;
else
Thread_Wen.Terminate;
end;
unit DrThread;interfaceuses
Classes,Graphics,Grids;type
TDrawThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure Draw;
public
FColor:TColor;
FP:TThreadPriority;
X1,Y1,X2,Y2:integer;
FDrawGrid:TDrawGrid;
Constructor Create(DrawGr:TDrawGrid;Col:TColor;P:TThreadPriority;X1s,Y1s,X2s,Y2s:integer);
end;implementation
uses show;Constructor TDrawThread.Create(drawGr:TDrawGrid;Col:TColor;P:TThreadPriority;X1s,Y1s,X2s,Y2s:integer);
begin
FDrawGrid:=DrawGr;
FColor:=Col;
X1:=X1s;
Y1:=Y1s;
X2:=X2s;
Y2:=Y2s;
fp:=p;
inherited Create(true);
Priority:=fp;
end;procedure TDrawThread.Draw;
begin
with FDrawGrid.canvas do
begin
lock;
Pen.Color:=FColor;
MoveTo(X1,Y1);
LineTo(X2,Y2);
unlock;
end;
end;procedure TDrawThread.Execute;
begin
while not terminated do
begin
synchronize(draw);
suspend;
end;
end;end.
各位帮我看看,该怎么改,(老板一定要用多线程做),
相关代码如下:
procedure TForm_show.FormCreate(Sender: TObject); //窗体产生
begin
.
.
Thread_Wen:=TDrawThread.Create(DrawGrid1,clRed,tpnormal,X1,Y1,X2,Y2);
end;procedure TForm_show.Timer_WenThrTimer(Sender: TObject); {温度线程启动}
begin
if ThrStart_Wen=1 then
begin
F_Wen:=StrToFloat(Edit_Wen.Text);
X1:=X2_Wen;
Y1:=Y2_Wen;
X2:=X1+Step_Wen;
Y2:=Y0-Round(scale_Wen*F_Wen);
X2_Wen:=X2;
Y2_Wen:=Y2;
Thread_Wen.Resume;
end;
else
Thread_Wen.Terminate;
end;
unit DrThread;interfaceuses
Classes,Graphics,Grids;type
TDrawThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure Draw;
public
FColor:TColor;
FP:TThreadPriority;
X1,Y1,X2,Y2:integer;
FDrawGrid:TDrawGrid;
Constructor Create(DrawGr:TDrawGrid;Col:TColor;P:TThreadPriority;X1s,Y1s,X2s,Y2s:integer);
end;implementation
uses show;Constructor TDrawThread.Create(drawGr:TDrawGrid;Col:TColor;P:TThreadPriority;X1s,Y1s,X2s,Y2s:integer);
begin
FDrawGrid:=DrawGr;
FColor:=Col;
X1:=X1s;
Y1:=Y1s;
X2:=X2s;
Y2:=Y2s;
fp:=p;
inherited Create(true);
Priority:=fp;
end;procedure TDrawThread.Draw;
begin
with FDrawGrid.canvas do
begin
lock;
Pen.Color:=FColor;
MoveTo(X1,Y1);
LineTo(X2,Y2);
unlock;
end;
end;procedure TDrawThread.Execute;
begin
while not terminated do
begin
synchronize(draw);
suspend;
end;
end;end.
解决方案 »
- 有谁做过 东软医保接口的?麻烦给指点一下呢?江湖救急阿
- 如何让pagecontrol中的tabsheet没有边框?
- delphi调用sql server的存储过程,老提示错误'@dwmc' not found?
- 获得Excel范围的问题,给100分
- 怎么到C定义的内存地址去读?
- 如何简便的从TList中取出部分结构体数据?
- 请教一个oicq功能的实现问题。
- Unidac放入datamodule中无法显示数据
- 高分!如何修改原有控件的事件呢?如修改Tedit控件的keypress事件呢?
- 各位输入法顶尖高手,如何能在英文win95/98中支持Microsoft的IME输入法接口?
- 请进,高分!请教你问题
- 那位大哥給個程序我學習學習?
begin
synchronize(draw);
//suspend;
end;
end;
写到TIMER里
你的ThrStart_Wen什么时候才能<>1
居然还是Synchronize的调用,这等于没用线程嘛!你挂起操作不应该在线程里。
你不如用消息通知主窗口挂起该线程
如:
procedure TDrawThread.Execute;
begin
while not terminated do
begin
synchronize(draw);
PostMessage(Handle, WM_USER + 1, 0, 0);
end;
end;再在窗口里加一个消息处理方法
procedure WMUser(var Message: TMessage); message WM_USER + 1;在这个消息处理方法里面Suspend该线程