我用多线程做图形动作处理,多线程无法即时处理完我图形操作!
我在主窗体中定义公有函数:
{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;
上面是我大概的程序源码。
问题是:如果采用线程做图形处理的话。是可以在窗体界面上做其它操作。
但是线程在处理图形时。在窗体界面上做其它操作,它会影响当前图形绘制的完整性,有时候图形无法正常处理完.(有时会出现内存不足的情况)。如果不用线程的话我无法即时在窗体上做其它操作。
不知如何能够两全其美的方法。
请高手指点..
我在主窗体中定义公有函数:
{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;
上面是我大概的程序源码。
问题是:如果采用线程做图形处理的话。是可以在窗体界面上做其它操作。
但是线程在处理图形时。在窗体界面上做其它操作,它会影响当前图形绘制的完整性,有时候图形无法正常处理完.(有时会出现内存不足的情况)。如果不用线程的话我无法即时在窗体上做其它操作。
不知如何能够两全其美的方法。
请高手指点..
不过用了同步,又何必用线程。
因为另一个Form窗体界面要在主窗体界面在上面即时显示。在这个Form窗体中定义了一个Message.
如Private
Procedure cm_mouseLeave(var MSG:TMessage);Message CM_MOUSELEAVE;我通过这个鼠标离开本窗体消息做其他操作。要不然我无法即时在本窗体界面上做其他操作。
一点建议:你的显示数据量很大还是"变化"很快? ,如果只是一般般的话,不应该出现干挠的,可能是你显示部分的代码有"硬伤",某几个地方浪费了大量CPU或硬盘资源(内存不足肯定是不应该的,估计有内存泄露,好好查一查)另,你的项目需要的正是多线程的解决方案,不用怀疑...
主窗体MainForm上作一些图片处理。就在MainForm.Canvas中作图片处理。
我还有一个分窗体为ToolButtonForm它总是显示在MainForm之上。就是相当于Style=StayOnTop;
在MainForm中作一些图片效果时要即时操作ToolButtonForm窗体上消息。
如果不采用多线程的话。ToolButtonForm就不能够即时响应我的要求了。它必须等着MainForm中作完图片处理之后才能响应我的要求。这种是不符合我的要求的。
如果采用多线程的话。ToolButtonForm可以即时响应我的要求。但是MainForm中作图片处理它无法正常显示完。就是绘图不完整。因为每次绘图的时候是不一样的。如果绘图时间短,那它就可以绘完整。如果长了一点那就不完整了。我的要求就是集合这面二个优点。不知如何做到?
简单的说:就是即要即时响应ToolButtonForm窗体中的消息,又要能够完整处理完MainForm中图片效果。不知如何做到?请高手提示。说出自己的想法? 谢谢!