关于Delphi的自带Demo(多线程)中的例子,有几个初级问题不明白,问一下大家!请大家耐心帮我看看,我对多线程了解不多。谢谢!

时间:2022-04-02 17:33:35
1、TSortThread类的构造函数:
constructor TSortThread.Create(Box: TPaintBox; var SortArray: array of Integer);
begin
  FBox := Box;
  FSortArray := @SortArray;
  FSize := High(SortArray) - Low(SortArray) + 1;
  //线程结束时释放其占用的资源
  FreeOnTerminate := True;
  inherited Create(False);
end;
请问inherited Create(False);这句话的意思是“不从TSortThread类的父类TThread中继承构造函数”的意思吗?

2、关于DoVisualSwap和VisualSwap的关系我这样理解正确吗?
DoVisualSwap是实现在TPaintBox中画图的过程,由于DoVisualSwap是线程TSortThread类的成员函数,而且这个函数中用到了VCL的对象TPaintBox,所以这个过程就不能被他所在的类TSortThread直接调用,必须要通过另一个方法中的Synchronize()来控制并发。而这个过程就是VisualSwap。

3、这个执行线程的简单过程能不能给解释一下呢?Slice关键字是什么意思啊?
procedure TSortThread.Execute;
begin
  Sort(Slice(FSortArray^, FSize));
end;

4、在三个排序的过程中都有这么一句话: if Terminated then Exit;这句话起什么作用?
是“线程被中止的时候退出排序过程”的意思吗?
procedure TSelectionSort.Sort(var A: array of Integer);
var
  I, J, T: Integer;
begin
  for I := Low(A) to High(A) - 1 do
    for J := High(A) downto I + 1 do
      if A[I] > A[J] then
      begin
        VisualSwap(A[I], A[J], I, J);
        T := A[I];
        A[I] := A[J];
        A[J] := T;
        if Terminated then Exit;
      end;
end;

5、在主窗体的单元中的那个初始化随机数组的过程中
procedure TThreadSortForm.RandomizeArrays;
var
  I: Integer;
begin
  if not ArraysRandom then
  begin
    Randomize;
    for I := Low(BubbleSortArray) to High(BubbleSortArray) do
      BubbleSortArray[I] := Random(170);
    SelectionSortArray := BubbleSortArray;
    QuickSortArray := BubbleSortArray;
    ArraysRandom := True;
    //PaintArray(BubbleSortBox,BubbleSortArray);
    //PaintArray(SelectionSortBox,SelectionSortArray);
    //PaintArray(QuickSortBox,QuickSortArray);
    Repaint;
  end;
end;
初始化完成后,那个Repaint的意思应该是在三个PaintBox控件上画出三个数组的初始化状态对吧?但是程序中没找到定义Repaint过程的地方啊?怎么莫名其妙地就蹦出来了?

6、关于开始排序按钮
procedure TThreadSortForm.StartBtnClick(Sender: TObject);
begin
  RandomizeArrays;
  ThreadsRunning := 3;
  with TBubbleSort.Create(BubbleSortBox, BubbleSortArray) do
    OnTerminate := ThreadDone;
  with TSelectionSort.Create(SelectionSortBox, SelectionSortArray) do
    OnTerminate := ThreadDone;
  with TQuickSort.Create(QuickSortBox, QuickSortArray) do
    OnTerminate := ThreadDone;
  StartBtn.Enabled := False;
end;
这个句子with TBubbleSort.Create(BubbleSortBox, BubbleSortArray) do OnTerminate := ThreadDone;  我大概能猜出来是执行TBubbleSort类的构造函数没错,do OnTerminate := ThreadDone;我也能猜出来,大概就是当线程结束的时候执行ThreadDone这个过程。
但是这样写我觉得挺别扭的,TBubbleSort的对象创建了吗?怎么调用这个对象呢?


大概就是这些问题了,可能有点长,希望给为帮忙看看!!谢谢!!

13 个解决方案

#1


>>请问inherited Create(False);这句话的意思
执行父类的 Create 方法

想当与先执行自己的扩充功能,在执行父类的代码

#2


2 你的理解应该大致对

3, Slice 应该是返回数组的部分,由第二个参数指定

#3


>> if Terminated then Exit;这句话起什么作用?

如果线程执行过程中, 你执行了取消的,就停止执行,退出

#4


楼上的,但是这个例子中并没有任何中止线程的按钮,是不是如果不写这句话对程序的整体执行也没有影响呢?只是这是一种良好的习惯吧?如果我再添加上控制没个线程“暂停”的按钮,那这个句子就有意义了对吗?

#5


To淘金坑:
false参数控制什么??
是说就控制是否先执行夫类的构造函数吗?

#6


但是这个例子中并没有任何中止线程的按钮,...

------
如果用户关闭主窗体...

#7


不好意思我不是那个意思,我的意思是一个人为的中止或者暂停的按钮……
不过楼上的兄弟说得也是,关闭主窗体就有可能,我去测试一下……

#8


5、在主窗体的单元中的那个初始化随机数组的过程中
procedure TThreadSortForm.RandomizeArrays;
var
  I: Integer;
begin
  if not ArraysRandom then
  begin
    Randomize;
    for I := Low(BubbleSortArray) to High(BubbleSortArray) do
      BubbleSortArray[I] := Random(170);
    SelectionSortArray := BubbleSortArray;
    QuickSortArray := BubbleSortArray;
    ArraysRandom := True;
    //PaintArray(BubbleSortBox,BubbleSortArray);
    //PaintArray(SelectionSortBox,SelectionSortArray);
    //PaintArray(QuickSortBox,QuickSortArray);
    Repaint;
  end;
end;
初始化完成后,那个Repaint的意思应该是在三个PaintBox控件上画出三个数组的初始化状态对吧?但是程序中没找到定义Repaint过程的地方啊?怎么莫名其妙地就蹦出来了?

6、关于开始排序按钮
procedure TThreadSortForm.StartBtnClick(Sender: TObject);
begin
  RandomizeArrays;
  ThreadsRunning := 3;
  with TBubbleSort.Create(BubbleSortBox, BubbleSortArray) do
    OnTerminate := ThreadDone;
  with TSelectionSort.Create(SelectionSortBox, SelectionSortArray) do
    OnTerminate := ThreadDone;
  with TQuickSort.Create(QuickSortBox, QuickSortArray) do
    OnTerminate := ThreadDone;
  StartBtn.Enabled := False;
end;
这个句子with TBubbleSort.Create(BubbleSortBox, BubbleSortArray) do OnTerminate := ThreadDone;  我大概能猜出来是执行TBubbleSort类的构造函数没错,do OnTerminate := ThreadDone;我也能猜出来,大概就是当线程结束的时候执行ThreadDone这个过程。
但是这样写我觉得挺别扭的,TBubbleSort的对象创建了吗?怎么调用这个对象呢?

这两个问题能回答一下吗?

#9


我再顶一下,这两天比较忙,都没什么时间来看这个了……

#10


仔细看看,都不难理解,很多不用问的

#11


self.Repaint

#12


我觉得楼主挺牛的,肯定是其他语言的高手。

#13


Slice 返回数组的一部分

#1


>>请问inherited Create(False);这句话的意思
执行父类的 Create 方法

想当与先执行自己的扩充功能,在执行父类的代码

#2


2 你的理解应该大致对

3, Slice 应该是返回数组的部分,由第二个参数指定

#3


>> if Terminated then Exit;这句话起什么作用?

如果线程执行过程中, 你执行了取消的,就停止执行,退出

#4


楼上的,但是这个例子中并没有任何中止线程的按钮,是不是如果不写这句话对程序的整体执行也没有影响呢?只是这是一种良好的习惯吧?如果我再添加上控制没个线程“暂停”的按钮,那这个句子就有意义了对吗?

#5


To淘金坑:
false参数控制什么??
是说就控制是否先执行夫类的构造函数吗?

#6


但是这个例子中并没有任何中止线程的按钮,...

------
如果用户关闭主窗体...

#7


不好意思我不是那个意思,我的意思是一个人为的中止或者暂停的按钮……
不过楼上的兄弟说得也是,关闭主窗体就有可能,我去测试一下……

#8


5、在主窗体的单元中的那个初始化随机数组的过程中
procedure TThreadSortForm.RandomizeArrays;
var
  I: Integer;
begin
  if not ArraysRandom then
  begin
    Randomize;
    for I := Low(BubbleSortArray) to High(BubbleSortArray) do
      BubbleSortArray[I] := Random(170);
    SelectionSortArray := BubbleSortArray;
    QuickSortArray := BubbleSortArray;
    ArraysRandom := True;
    //PaintArray(BubbleSortBox,BubbleSortArray);
    //PaintArray(SelectionSortBox,SelectionSortArray);
    //PaintArray(QuickSortBox,QuickSortArray);
    Repaint;
  end;
end;
初始化完成后,那个Repaint的意思应该是在三个PaintBox控件上画出三个数组的初始化状态对吧?但是程序中没找到定义Repaint过程的地方啊?怎么莫名其妙地就蹦出来了?

6、关于开始排序按钮
procedure TThreadSortForm.StartBtnClick(Sender: TObject);
begin
  RandomizeArrays;
  ThreadsRunning := 3;
  with TBubbleSort.Create(BubbleSortBox, BubbleSortArray) do
    OnTerminate := ThreadDone;
  with TSelectionSort.Create(SelectionSortBox, SelectionSortArray) do
    OnTerminate := ThreadDone;
  with TQuickSort.Create(QuickSortBox, QuickSortArray) do
    OnTerminate := ThreadDone;
  StartBtn.Enabled := False;
end;
这个句子with TBubbleSort.Create(BubbleSortBox, BubbleSortArray) do OnTerminate := ThreadDone;  我大概能猜出来是执行TBubbleSort类的构造函数没错,do OnTerminate := ThreadDone;我也能猜出来,大概就是当线程结束的时候执行ThreadDone这个过程。
但是这样写我觉得挺别扭的,TBubbleSort的对象创建了吗?怎么调用这个对象呢?

这两个问题能回答一下吗?

#9


我再顶一下,这两天比较忙,都没什么时间来看这个了……

#10


仔细看看,都不难理解,很多不用问的

#11


self.Repaint

#12


我觉得楼主挺牛的,肯定是其他语言的高手。

#13


Slice 返回数组的一部分