请教多线程的问题,我有一个测试列表放在dbgrid中,每个测试每间隔几秒做一次测试, ( 积分: 100 )

  • 主题发起人 主题发起人 lhjiang
  • 开始时间 开始时间
L

lhjiang

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个测试列表放在dbgrid中,每个测试每间隔几秒做一次测试,测试的内容如ping,url测试等,请教是否要采用多线程处理?那如何处理多线程呢?
 
我有一个测试列表放在dbgrid中,每个测试每间隔几秒做一次测试,测试的内容如ping,url测试等,请教是否要采用多线程处理?那如何处理多线程呢?
 
可以不采用多线程,把测试放在Timer中进行也可以,不过多线程处理得更快。
 
是否用多线程关键在于你是否需要并行处理,如果你的测试会持续一段时间,而第二个测试会在第一个测试没有结束就开始,这就需要多线程了,不然就没必要用多线程。
 
我的测试项目应该存在同时处理的情况,所以如何采用多线程啊,可以给我个思路吗?然后我需要把每个测试的结果写入到数据库中。
 
写一个线程类,测试在线程里完成,留出数据输入接口和结果输出接口,等一批测试都完成后把结果统一写入数据库
 
楼上,可否再明白一点
 
nicai_wgl:我程序现在有执行时间这个选项,那是不是也要采用多线程处理,用timer定时来处理好不好?还有为什么一定要等一批测试完了以后统一写入数据库,这样比一个一个测试结果分别写入数据库要好吗?
 
to lhjiang:
1、是否需要采用多线程处理关键在于你的程序是否需要并行处理任务,比如说你需要同时进行两个测试,或者更多个测试,那就需要多线程。
如果我理解的没错的话,你的程序需要做多个测试,每个测试间隔几秒钟重复一次,得出结果后写入数据库。
方法一:如果测试间隔时间较长,测试过程耗时较短,可以用定时器处理,定时器触发后用一个循环来执行你的所有测试..例:
procedure TForm1.Timer1Timer(Sender: TObject);
var
i: Integer;
begin
for i := 1 to DBGrid1.DataSource.DataSet.RecordCountdo
begin
{你的测试代码}
end;
end;
这样实现存在的问题有 A、如果其中一个测试出现问题,会影响其他测试的进行 B、时间间隔不好控制,如果测试项比较多,整个测试循环会需要很长时间。
 
方法二:如果需要测试的内容较多,时间间隔比较短,我建议还是多线程来并行处理,以获得较好的效果。例:
unit Unit2;
interface
uses
Classes;
type
TTestData = record
//....
end;

TTestResult = record
//....
end;

TTestThreat = class(TThread)
private
FTestData: TTestData;
function Test(Value1: TTestData;
Value2: TTestResult): Boolean;
procedure OutputResult(Value: TTestResult);
protected
procedure Execute;
override;
public
constructor Create(CreateSuspended: Boolean);
destructor Destroy;
override;
procedure InputTestData(Value: TTestData);
{输入测试数据}
end;

implementation
uses SysUtils;
constructor TTestThreat.Create(CreateSuspended: Boolean);
begin
inherited;
{InputTestData;
}
end;

destructor TTestThreat.Destroy;
begin

inherited;
end;

procedure TTestThreat.Execute;
begin
while not Terminateddo
begin
try
{ if Test() then
OutputResult();
}
except
end;
Sleep(1000);
end;
end;

procedure TTestThreat.InputTestData(Value: TTestData);
begin
//....
end;

procedure TTestThreat.OutputResult(Value: TTestResult);
begin
//....
end;

function TTestThreat.Test(Value1: TTestData;
Value2: TTestResult): Boolean;
begin
//....
end;

end.
 
2、至于为什么要等一批数据测试完后统一写入数据库,原因有二:A、多线程处理时,可能会有几个线程同时往数据库写入数据,可能引起出错。B、提高写入数据的效率。
3、如果用多线程还需注意的: 每个线程输出测试结果和把测试结果写入数据库需要临界区或其他保护。
 
多人接受答案了。
 
再次请教nicai_wgl:测试结果写入数据库中如何使用临界区保护策略?可以详细说一下吗
 
后退
顶部