我做了一个多窗体多线程通讯程序,主线程用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.

解决方案 »

  1.   

    while not terminated do
       begin
       synchronize(draw);
       //suspend;
      end;
    end;
    写到TIMER里
      

  2.   

    那procedure TDrawThread.Execute;里写什么?
      

  3.   

    你跟踪一下你的程序看看Thread_Wen.Terminate;到底执行了没有?
    你的ThrStart_Wen什么时候才能<>1
      

  4.   

    晕,你整个过程里就一句话
    居然还是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该线程
      

  5.   

    老兄,一个问题问几次,我不是发了个DEMO给你吗?