FileReadToBufferThreadUnit.pas 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. unit FileReadToBufferThreadUnit;
  2. interface
  3. uses
  4. SysUtils, Classes, Windows, Forms, Controls, SyncObjs;
  5. type
  6. TFileReadToBufferThread = class(TThread)
  7. private
  8. FHasTerminated: Boolean;
  9. FFileHandle: THandle;
  10. FBufferStream: TStream;
  11. FLock: TMultiReadExclusiveWriteSynchronizer;
  12. protected
  13. procedure Execute; override;
  14. public
  15. constructor Create(FileHandle: THandle; BufferStream: TStream);
  16. destructor Destroy; override;
  17. property HasTerminated: Boolean read FHasTerminated;
  18. property Lock: TMultiReadExclusiveWriteSynchronizer read FLock;
  19. end;
  20. implementation
  21. const
  22. BytesToRead = 256;
  23. { THandleWaitThread }
  24. constructor TFileReadToBufferThread.Create(FileHandle: HFile; BufferStream: TStream);
  25. begin
  26. inherited Create (True);
  27. FLock := TMultiReadExclusiveWriteSynchronizer.Create;
  28. FHasTerminated := False;
  29. FreeOnTerminate := False;
  30. FFileHandle := FileHandle;
  31. FBufferStream := BufferStream;
  32. Resume;
  33. end;
  34. destructor TFileReadToBufferThread.Destroy;
  35. begin
  36. FLock.Free;
  37. inherited;
  38. end;
  39. procedure TFileReadToBufferThread.Execute;
  40. var
  41. Buffer: array [1..BytesToRead] of Byte;
  42. Count: Cardinal;
  43. begin
  44. while (not Terminated) and ReadFile (FFileHandle, Buffer, BytesToRead, Count, nil) do begin
  45. Lock.BeginWrite;
  46. FBufferStream.Write (Buffer, Count);
  47. Lock.EndWrite;
  48. end;
  49. FHasTerminated := True;
  50. end;
  51. end.