我现在有一个几乎完成的应用程序,下一个要实现的功能是线程。我选择使用BeginThread(),虽然我知道Delphi中也有TThread。我遇到的问题是BeginThread()调用的结构。通常情况下,调用我想要线程化的函数的程序行是
CompareFiles(form1.Edit3.Text,Form1.Edit4.Text,Form1.StringGrid2,op);
op是一个整数。
我替换掉它的那一行代码,用它来创建一个线程:
BeginThread(nil,0,CompareFiles,Addr('form1.Edit3.Text,Form1.Edit4.Text,Form1.StringGrid2,op'),0,x);
根据我查到的关于如何使用BeginThread()的信息,这应该是一个很好的调用方法,但是在编译时,我遇到了有关BeginThread()语句参数结构的编译器错误。
附加信息编辑:
当前调用CompareFiles的过程是
procedure TForm1.Panel29Click(Sender: TObject);
var
op,x : integer;
begin
if (Form1.Edit3.Text <> '') AND (Form1.Edit4.Text <> '') then
begin
op := 3;
if RadioButton7.Checked = True then op := 0;
if RadioButton3.Checked = True then op := 1;
if RadioButton4.Checked = True then op := 2;
if RadioButton5.Checked = True then op := 3;
if RadioButton6.Checked = True then op := 4;
CompareFiles(form1.Edit3.Text,Form1.Edit4.Text,Form1.StringGrid2,op);
end;
end;
如果像几个人建议的那样使用 TThread,并且像 Rob 展示的那样,我对如何传递 op、Edit3/4.Text 和 StringGrid2 到 CompareFiles 感到困惑。猜测从我看到的 TThread 示例中,我认为我应该用 TCompareFilesThread.Execute
替换上面的代码,然后将 Panel29Click 中的当前代码放入 TCompareFilesThread.Create
,最后添加即可。
FEdit3Text := Edit3Text;
FEdit4Text := Edit4Text;
FGrid := Grid;
转化为此
FEdit3Text := Form1.Edit3.Text;
FEdit4Text := Form1.Edit4.Text;
FGrid := Form1.StringGrid2;
但我有一种无法言喻的感觉,完全错了。
Execute
方法,线程会自动调用它。如果你自己调用它,那么你将从主线程中调用它,在这种情况下,你失去了在单独的线程中运行的所有优势。请考虑给你的窗体和控件赋予有意义的名称。你的计算机选择了现在拥有的名称,它们很糟糕。你是一个人,你知道得更好,所以根据它们的功能而不是按照你放置它们的顺序来命名它们。 - Rob Kennedy