我用多线程做图形动作处理,多线程无法即时处理完我图形操作!
我在主窗体中定义公有函数:
{MainUnit;}
   Timer1:TTimer;
Public
 Procedure RandProc(Num:Byte);
var CS:TRTLCriticalSection;
    RandProc_Num:Byte=0;
Implementation;
Uses ThreadUnit;
Procedure TMainForm.Timer1Timer(Sender:TObject);
 begin
 Timer1.Enabled:=False;//防止再次触发线程;
 IniTializeCriticalSection(CS);
 TDrawThread.Create(RandProc_Num); 
 end;
Procedure TMainForm.RandProc(Num:Byte);
  begin
  Canvas.Lock;
    Case Num of
       0: ...  //一些图形处理
       1: ...  //一些图形处理
       .....
       end;//Case
  Canvas.Unlock;
  end;我又定义了一个线程单元:
{ThreadUnit;}
Uses MainUnit;
   TDrawPicture=Class(TThread)
     Private
       FNum:Byte;
       Procedure ShowPic;
       Procedure ThreadDone(Sender:TObject);
     protected
        Procedure Execute;Override;
     Public
        ConStructor Create(Num:Byte); 
     end; 
ConStructor Create(Num:Byte);
  begin
   FNum:=Num;
   FreeOnTerminate:=True;
   Inherited Create(False); 
  end;TDrawPicture.ShowPic;
  begin
   MainForm.RandProc(FNum);
  end;
TDrawPicture.Execute;
  begin
   OnTerminate:=ThreadDone;
   EnterCriticalSection(CS);
   ShowPic;
   LeaveCriticalSection(CS);
  end;     
TDrawPicture.ThreadDone(Sender:TObject);
  begin
  DeleteCriticalSection(CS);
  MainForm.Timer1.Enabled:=True;  //完成这个线程后再触发Timer
  end;
上面是我大概的程序源码。
问题是:如果采用线程做图形处理的话。是可以在窗体界面上做其它操作。
        但是线程在处理图形时。在窗体界面上做其它操作,它会影响当前图形绘制的完整性,有时候图形无法正常处理完.(有时会出现内存不足的情况)。如果不用线程的话我无法即时在窗体上做其它操作。
 不知如何能够两全其美的方法。
请高手指点..  

解决方案 »

  1.   

    楼主程序那样现象只是线程安全性造成的。。可以用Synchronize同步一下。
    不过用了同步,又何必用线程。
      

  2.   

    因为我的程序要求。是这样子的。
    因为另一个Form窗体界面要在主窗体界面在上面即时显示。在这个Form窗体中定义了一个Message.
    如Private
      Procedure cm_mouseLeave(var MSG:TMessage);Message CM_MOUSELEAVE;我通过这个鼠标离开本窗体消息做其他操作。要不然我无法即时在本窗体界面上做其他操作。
      

  3.   

    呵,,你在timer中直接画不就完了么,如果一定要用线程的话,就要加上同步函数Synchronize(ShowPic),因为VCL的界面操作是线程不安全的。而且如果要用线程的话,你大可不用timer,线程也不用重复创建吧。
      

  4.   

    ~晕,偶然找到了一个熟悉的话题,却是我不熟悉的Delphi...
    一点建议:你的显示数据量很大还是"变化"很快? ,如果只是一般般的话,不应该出现干挠的,可能是你显示部分的代码有"硬伤",某几个地方浪费了大量CPU或硬盘资源(内存不足肯定是不应该的,估计有内存泄露,好好查一查)另,你的项目需要的正是多线程的解决方案,不用怀疑...
      

  5.   

    我的程序要求如下:
    主窗体MainForm上作一些图片处理。就在MainForm.Canvas中作图片处理。
    我还有一个分窗体为ToolButtonForm它总是显示在MainForm之上。就是相当于Style=StayOnTop;
    在MainForm中作一些图片效果时要即时操作ToolButtonForm窗体上消息。
       如果不采用多线程的话。ToolButtonForm就不能够即时响应我的要求了。它必须等着MainForm中作完图片处理之后才能响应我的要求。这种是不符合我的要求的。
       如果采用多线程的话。ToolButtonForm可以即时响应我的要求。但是MainForm中作图片处理它无法正常显示完。就是绘图不完整。因为每次绘图的时候是不一样的。如果绘图时间短,那它就可以绘完整。如果长了一点那就不完整了。我的要求就是集合这面二个优点。不知如何做到?
        简单的说:就是即要即时响应ToolButtonForm窗体中的消息,又要能够完整处理完MainForm中图片效果。不知如何做到?请高手提示。说出自己的想法? 谢谢!
      

  6.   

    什么样的图片处理,具体些?来个sample?