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 方法
想当与先执行自己的扩充功能,在执行父类的代码
执行父类的 Create 方法
想当与先执行自己的扩充功能,在执行父类的代码
#2
2 你的理解应该大致对
3, Slice 应该是返回数组的部分,由第二个参数指定
3, Slice 应该是返回数组的部分,由第二个参数指定
#3
>> if Terminated then Exit;这句话起什么作用?
如果线程执行过程中, 你执行了取消的,就停止执行,退出
如果线程执行过程中, 你执行了取消的,就停止执行,退出
#4
楼上的,但是这个例子中并没有任何中止线程的按钮,是不是如果不写这句话对程序的整体执行也没有影响呢?只是这是一种良好的习惯吧?如果我再添加上控制没个线程“暂停”的按钮,那这个句子就有意义了对吗?
#5
To淘金坑:
false参数控制什么??
是说就控制是否先执行夫类的构造函数吗?
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的对象创建了吗?怎么调用这个对象呢?
这两个问题能回答一下吗?
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 方法
想当与先执行自己的扩充功能,在执行父类的代码
执行父类的 Create 方法
想当与先执行自己的扩充功能,在执行父类的代码
#2
2 你的理解应该大致对
3, Slice 应该是返回数组的部分,由第二个参数指定
3, Slice 应该是返回数组的部分,由第二个参数指定
#3
>> if Terminated then Exit;这句话起什么作用?
如果线程执行过程中, 你执行了取消的,就停止执行,退出
如果线程执行过程中, 你执行了取消的,就停止执行,退出
#4
楼上的,但是这个例子中并没有任何中止线程的按钮,是不是如果不写这句话对程序的整体执行也没有影响呢?只是这是一种良好的习惯吧?如果我再添加上控制没个线程“暂停”的按钮,那这个句子就有意义了对吗?
#5
To淘金坑:
false参数控制什么??
是说就控制是否先执行夫类的构造函数吗?
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的对象创建了吗?怎么调用这个对象呢?
这两个问题能回答一下吗?
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 返回数组的一部分