unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
{
题库总题量按每组C_groupCnt道题进行分若干组,组内开启C_threadCnt个线程,
每个线程处理perCnt= C_groupCnt/C_threadCnt 个试题;
线程内实际比对 perCnt 个试题;
}
const
C_threadCnt = 10; //开启线程个数
C_groupCnt = 5000; //题数最小分组
type
TMyThread = class(TThread)
protected
procedure Execute; override;
public
iThreadId: Integer;
bFinished: Boolean;
end;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
itemArray: TStringList;
totalCnt: integer; //题库题总数
perCnt: integer; //每个线程处理题量
RunThread: array[0..C_threadCnt] of TMyThread; //运行线程实例对象
function InitItemArray(index: integer; var lst: TStringList): Boolean;
function CheckAllThreadFinished(): Boolean;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses CnStrDiff;
procedure TMyThread.Execute;
var
i, j: Integer;
index: integer;
sourceStr, destStr, resStr: string;
begin
FreeOnTerminate := false; {这可以让线程执行完毕后随即不释放}
bFinished := false;
index := iThreadId;
for i := index * form1.perCnt to form1.perCnt + index * form1.perCnt - 1 do
begin
sourceStr := Form1.itemArray.strings[i];
for j := index * form1.perCnt + 1 to form1.perCnt + index * form1.perCnt - 1 do
begin
destStr := Form1.itemArray.strings[j];
resStr := FormatFloat('00.0000 %', SimilarText(sourceStr, destStr, True) * 100);
//比较过程
TLabel(Form1.FindComponent('Label' + inttostr(index + 1))).Caption := '线程' + inttostr(index) + '正在处理:'
+ sourceStr + '-' + destStr + '=' + resstr;
end;
end;
bFinished := true;
TLabel(Form1.FindComponent('Label' + inttostr(index + 1))).Caption := '线程' + inttostr(index) + '处理完';
end;
function TForm1.InitItemArray(index: integer; var lst: TStringList): Boolean;
var
i: integer;
begin
//按实际个数读取;
for i := index * C_groupCnt + 0 to index * C_groupCnt + C_groupCnt - 1 do
begin
lst.Add(IntToStr(i) + '-' + FormatdateTime('yyyy-mm-dd HH:MM:SS', Now));
end;
result := true;
end;
function TForm1.CheckAllThreadFinished(): Boolean;
var
i: integer;
begin
Result := true;
for i := 0 to C_threadCnt - 1 do
if not RunThread[i].bFinished then
begin
Result := false;
Break;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
iGroupIndex, iGroupCnt: integer;
begin
totalCnt := 6000; //总题数
itemArray := nil;
//题库按一组groupCnt个题分若干组
if totalCnt mod C_groupCnt = 0 then
iGroupCnt := totalCnt div C_groupCnt
else
iGroupCnt := totalCnt div C_groupCnt + 1;
//按组循环
for iGroupIndex := 0 to iGroupCnt - 1 do
begin
if itemArray <> nil then
itemArray.Free;
itemArray := TStringList.Create;
//读取试题存入itemArray
InitItemArray(iGroupIndex, itemArray);
//组内试题个数;
if itemArray.Count < C_groupCnt then
perCnt := Round(itemArray.Count / C_threadCnt) //10个线程中每个线程分配的比对题个数5000/10=500
else
perCnt := Round(C_groupCnt / C_threadCnt);
for i := 0 to C_threadCnt - 1 do
begin
if RunThread[i] <> nil then
begin
if not TMyThread(RunThread[i]).Terminated then
TMyThread(RunThread[i]).Terminate; //需等待线程结束
TMyThread(RunThread[i]).Free;
end;
RunThread[i] := TMyThread.Create(true);
RunThread[i].iThreadId := i;
RunThread[i].bFinished := false;
RunThread[i].Resume;
end;
//等待所有线程结束
while not CheckAllThreadFinished() do
begin
Application.ProcessMessages;
Sleep(3000);
end;
Label11.Caption := '第' + IntToStr(iGroupIndex) + ' 组已处理完';
end;
//pubArray.Free;
end;
end.