好像线程不能重载构造函数吗?那用什么方式传参数给线程最安全且快捷呢,大家有好方法说说?(50分)

  • 主题发起人 主题发起人 诸葛白痴
  • 开始时间 开始时间

诸葛白痴

Unregistered / Unconfirmed
GUEST, unregistred user!
我用过程中的变量传给线程,但我又怕会造成不安全,有没有万无一失的方法呢?
答案是: 我不知道,您呢?
 
unit Unit2;
interface
uses
Classes,Graphics,windows, ExtCtrls;
type
paintclock = class(TThread)
private
fbox:tpaintbox;
a:integer;
b,c,x,y:integer;
proceduredo
drawlines;
protected
procedure drawlines;
procedure Execute;
override;
public
constructor create(box:tpaintbox);//这里重造建构函数。
end;

implementation
procedure paintclock.drawlines;
begin
...
end;

constructor paintclock.create(box:tpaintbox);
begin
a:=0;
fbox:=box;
freeonterminate:=true;
inherited create(false);
end;

procedure paintclock.Execute;
begin
drawlines;
end;

procedure paintclock.dodrawlines;
begin
...
end;

end.
 
要传参数给线程很简单阿。
不一定要重载构造函数的,继承thread类,在其中设置几个属性,外面把
数据赋值给属性,类里面execute就可以在它的任何位置使用这些数据了,比较灵活
 
多人接受答案了。
 
顺便多问两位仁兄一个相关问题:我是在一个动态生成的表单生成一个搜索的线程,这时
要在新生成的搜索中引用到动态表单的控件,但会出现错误,说表单找不到,我也知道
会出错,但不知如何解决,用application.createform()创建的就不会,但动态生成的
就会,如何解决动态生成表单的引用问题?
 
POST你的有关代码上来看看。
 
to yhaochuan兄:您上面的代码的调试过吗?我查VCL的源代码,好像线程的构造不能
被重载,因为它不是虚函数,我是在BCB上试的,不行,你能帮我确定一下吗?因为
我这没装Delphi
 
是的,Create不能被 Override
因为TThread的Create里面是有代码的,而一般的可Override的过程在父辈都没有实作的,
也就是说在父辈那里可被Override的过程其实是个空壳,里面没有代码。
对BCB我不熟。你有时间亲自试试,会比我直接给你结果会使得到更多的知识。
 
啊! 出手太早了,嘻嘻
不过还是谢谢你了,我已经知道如何解决了!
 
你的解决方法和我和一样吗?
如果不一样,那又是怎么解决的?
 
to yhaochuan: 我说得太早了,不能用啊,我是要传一个表单给线程,让它可以引用其
表单中的控件,但老出错,见:
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=852789
代码:
__fastcall TSearchThread::TSearchThread(bool CreateSuspended) //线程构造函数
: TThread(CreateSuspended)
{
FreeOnTerminate = true;
SearchForm->GroupBox2->Visible = false;
SearchForm->GroupBox3->Visible = true;
SearchForm->GroupBox3->Align = alClient;
}
线程的头文件:
class TSearchThread : public TThread
{
private:
protected:
void __fastcall Execute();
public:
__fastcall TSearchThread(bool CreateSuspended);
TForm *SearchForm;
};
搜索的启动代码:
{
SpeedButton1->Tag = 1;
Animate1->Visible = true;
Animate1->Active = true;
SpeedButton1->Caption = "停止(&S)";
SpeedButton2->Enabled = false;
SearchThread = new TSearchThread(true);
SearchThread->SearchForm = this;
SearchThread->Resume();
}
以上代码在编译时出错,说GroupBox不是TForm类的一个对象,但将TForm *SearchForm
改成TSearchForm *SearchForm时声明错误,你能快快帮我吗?
 
问题已经解决,线程是可以重载的,看看例程就知道了,谢谢大家!
 
后退
顶部