我做了一个单窗体多线程通讯程序,主线程用Mscomm定时收数据,一线程实现动态绘图,由按钮启动另一Timer,定时调用绘图线程,程序运行很好。后来在前加了其他窗体,由窗体的OnCreate事件启动定时收数据,运行很好,再加上定时调用绘图线程时,一旦运行至该窗体,界面出来后很快提示出错:EAccess Violation with message 'Access Violation at address 004166cc in module \'user.exe',Write of address 000000c'.''user.exe'为工程名。
各位高手们,帮我看看怎么办。

解决方案 »

  1.   

    同意,把启动定时收数据的线程放到窗体的onshow中去试试,定时器的触发也要考虑用何种机制..........个人观点
      

  2.   

    会不会是线程同步的问题?
    贴点代码吧。也请顺便帮我看看:
    http://www.csdn.net/expert/topic/1043/1043824.xml?temp=.6844904
      

  3.   

    先谢谢各位
    我把启动定时收数据的线程放到窗体的onActivate中去试过,同样抱错。
    部分代码:
    procedure TForm_show.FormCreate(Sender: TObject);
    begin
     if (Timer_WenThr.Enabled=false) and (ThrStart_Wen=1) then  {温度线程时间开关}
         begin
            Timer_WenThr.Enabled:=True;
            Timer_WenThr.Interval:=T_Interval;
            Scale_Wen:=3.5;
            Step_Wen:=Drawgrid1.DefaultColWidth+1 ;
           X2_Wen:=X0;                {中间变量}
           Y2_Wen:=Y0;
    end;procedure TForm_show.Timer_WenThrTimer(Sender: TObject);
    begin
       if ThrStart_Wen=1 then
         begin
           if Length(Edit_Wen.Text)=0 then Thread_Wen.Suspend
           else
             begin
                 with DrawGrid1.Canvas do
                  X1:=X2_Wen;
                 Y1:=Y2_Wen;
               F_Wen:=StrToFloat(Edit_Wen.Text);
               X2:=X1+Step_Wen;
               Y2:=Y0-Round(scale_Wen*F_Wen);
               X2_Wen:=X2;
               Y2_Wen:=Y2;
                     Thread_Wen:=TDrawThread.Create  (DrawGrid1,clRed,tpnormal,X1,Y1,X2,Y2);
               Thread_Wen.Resume;
             end;
         end
        else
         Thread_Wen.Terminate;
    end;
      

  4.   

    如果,绘制使用 vcl 函数,建议使用同步索定
      

  5.   

    在线程里对vcl用了lock\unlock.