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

  • 主题发起人 主题发起人 bryantd
  • 开始时间 开始时间
B

bryantd

Unregistered / Unconfirmed
GUEST, unregistred user!
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) - 1do
for J := High(A)do
wnto I + 1do
if A > A[J] then
begin
VisualSwap(A, A[J], I, J);
T := A;
A := 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 := 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的对象创建了吗?怎么调用这个对象呢?

大概就是这些问题了,可能有点长,希望给为帮忙看看!!谢谢!!
 
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) - 1do
for J := High(A)do
wnto I + 1do
if A > A[J] then
begin
VisualSwap(A, A[J], I, J);
T := A;
A := 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 := 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的对象创建了吗?怎么调用这个对象呢?

大概就是这些问题了,可能有点长,希望给为帮忙看看!!谢谢!!
 
inherited Create(False);这句话的意思是“从TSortThread类的父类TThread中继承构造函数”的意思.
 
false在inherited Create(False);中是指立即执行。
 
应该是这样的吧inherited Create(False);或者inherited Create(True);都是执行父类的构造函数的。。因为它的父类为tObject,执不执行都一个样。
true/false的区别在于,在他的类函数threadProc中有一个这样的判断:
if Thread.FSuspended then
sem_wait(Thread.FCreateSuspendedSem);
这个true/false 都是付着给FSuspended的,也就有了等待执行或立即执行
 
先看看
过阵子再给你答复
 
1、请问inherited Create(False);这句话的意思是“不从TSortThread类的父类TThread中继承构造函数”的意思吗?
不是这个意思,参数 False 的意思是线程创建后不挂起,而是立即执行。
2、关于DoVisualSwap和VisualSwap的关系的理解
由于DoVisualSwap调用了 vcl 控件的方法,但大多数 vcl 的窗口方法都是线程不安全的,所以要在外面包上 Synchronize 来使其线程安全。
3、 Slice 使取得数组的一部分
4、在三个排序的过程中都有这么一句话: if Terminated then
Exit;这句话起什么作用?
由于排序中由循环,所以要时时检查成员变量 Terminated 的值,看是否有其它线程使自己退出的指令,若 Terminated 为 True,很可能主线程取消了排序操作(比如关闭窗体),此时无论是否排序完成,都立刻退出
5、Repaint 是其父类的操作,重画
6、这个句子with TBubbleSort.Create(BubbleSortBox, BubbleSortArray) 返回一个 TBubbleSort 的实例,也就是 TBubbleSort 的一个对象实例 ,大致相当与以下语句
var
aBubbleSort: TBubbleSort;
begin
aBubbleSort := TBubbleSort.Create(BubbleSortBox, BubbleSortArray);
aBubbleSort.OnTerminate := ThreadDone;
end;
 
后退
顶部