Cách tốt nhất để viết một bài kiểm tra Delphi DUnit cho một hậu duệ TThread khi FreeOnTerminate = True là gì? Các TThread hậu duệ trả về một tài liệu tham khảo mà tôi cần để kiểm tra, nhưng tôi không thể tìm ra cách để chờ cho thread để kết thúc trong các thử nghiệm ...Kiểm tra đơn vị Delphi cho một TThread với FreeOnTerminate = True
unit uThreadTests;
interface
uses
Classes, TestFramework;
type
TMyThread = class(TThread)
strict private
FId: Integer;
protected
procedure Execute; override;
public
constructor Create(AId: Integer);
property Id: Integer read FId;
end;
TestTMyThread = class(TTestCase)
strict private
FMyId: Integer;
procedure OnThreadTerminate(Sender: TObject);
protected
procedure SetUp; override;
procedure TearDown; override;
published
procedure TestMyThread;
end;
implementation
{ TMyThread }
constructor TMyThread.Create(AId: Integer);
begin
FreeOnTerminate := True;
FId := AId;
inherited Create(False);
end;
procedure TMyThread.Execute;
begin
inherited;
FId := FId + 1;
end;
{ TestTMyThread }
procedure TestTMyThread.TestMyThread;
//var
// LThread: TMyThread;
begin
// LThread := TMyThread.Create(1);
// LThread.OnTerminate := OnThreadTerminate;
// LThread.WaitFor;
// CheckEquals(2, FMyId);
// LThread.Free;
///// The above commented out code is only useful of FreeOnTerminate = False;
with TMyThread.Create(1) do
begin
OnTerminate := OnThreadTerminate;
WaitFor; /// Not sure how else to wait for the thread to finish?
end;
CheckEquals(2, FMyId);
end;
procedure TestTMyThread.OnThreadTerminate(Sender: TObject);
begin
FMyId := (Sender as TMyThread).Id;
end; /// When FreeOnTerminate = True - THIS LINE CAUSES ERROR: Thread Error the handle is invalid
procedure TestTMyThread.SetUp;
begin
inherited;
end;
procedure TestTMyThread.TearDown;
begin
inherited;
end;
initialization
RegisterTests([TestTMyThread.Suite]);
end.
ý tưởng Bất kỳ sẽ được hoan nghênh.
Delphi 2010.
Cảm ơn câu trả lời Rob. Tôi chưa có thời gian để kiểm tra giải pháp nhưng sẽ thử vào ngày mai. –
Xin chào Rob, cảm ơn câu trả lời của bạn dường như đang hoạt động tốt. Tôi đã chấp nhận điều này như là câu trả lời. Ngoài ra, có một câu trả lời thú vị được đăng bên dưới bằng cách sử dụng các chuỗi ẩn danh. Tôi vẫn còn trên Delphi 2010 vì vậy tôi không có quyền truy cập vào nó, nhưng trông giống như một giải pháp thanh lịch. Sẽ kiểm tra điều đó một khi tôi đã nâng cấp. Chúc mừng. –