【发布时间】:2011-06-14 21:51:12
【问题描述】:
我现在有一个几乎完成的应用程序,我要实现的下一个功能是线程。我选择使用 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;
但我有这种烦人的感觉,完全不合时宜。
【问题讨论】:
-
“关于事物不匹配的投诉”不是一个很有用的描述。您能否编辑您的问题并将错误消息的副本粘贴到其中?
-
我也很好奇你为什么选择不使用TThread?在没有良好对象封装的情况下使用全局线程函数会使与并发和竞争条件相关的事情变得非常复杂。我也很好奇为什么您即将完成应用程序然后决定添加线程。 IMO,应该从一开始就考虑线程,而不是事后考虑。如果不及早考虑到,很有可能会穿过地雷。
-
现在实现线程的原因是这对我来说是一个学习应用程序。线程一直是计划好的,现在应用程序的核心功能已经完成(大部分),只是为了实现它。至于 TThread,我似乎找不到很好的解释来说明如何使用它。
-
我在这里开始学习使用 Delphi 进行线程处理:eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/ToC.html 也许对您来说也是一个好的开始?
-
不要不要自己调用
Execute方法。线程会自动调用它。如果您自己调用它,您将从主线程调用它,此时您将失去在单独线程中运行的所有优势。请考虑为您的表单和控件提供有意义的名称。您的计算机选择了您现在拥有的名称,它们很糟糕。您是人类,而且您知道得更多,因此请根据他们所做的而不是根据您碰巧将它们放在表格上的顺序来控制并命名它们。
标签: multithreading delphi beginthread