asiotest.pp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // AsyncIO test by Sebastian Guenther, [email protected]
  2. // This file is in the public domain
  3. {$ifndef unix}
  4. {$fatal This test is only for Unix platforms}
  5. {$endif}
  6. {$MODE objfpc}
  7. program asiotest;
  8. uses SysUtils, Classes, Crt, FPAsync;
  9. type
  10. TASIOTest = class
  11. protected
  12. FManager: Teventloop;
  13. Input: THandleStream;
  14. MyTimer : Pointer;
  15. procedure InputAvailable(UserData: TObject);
  16. procedure TimerHandler(UserData: TObject);
  17. public
  18. constructor Create(AManager: Teventloop);
  19. destructor Destroy; override;
  20. end;
  21. procedure TASIOTest.InputAvailable(UserData: TObject);
  22. var
  23. b: Byte;
  24. begin
  25. b := Input.ReadByte;
  26. Write('Input available: ');
  27. if b >= 32 then
  28. WriteLn('"', Chr(b), '"')
  29. else
  30. WriteLn('#', b);
  31. case b of
  32. Ord('q'): FManager.Break;
  33. Ord('t'): begin
  34. FManager.RemoveTimerNotify(MyTimer);
  35. writeln('Timer stopped');
  36. end;
  37. end;
  38. end;
  39. procedure TASIOTest.TimerHandler(UserData: TObject);
  40. begin
  41. writeln('Timer');
  42. end;
  43. constructor TASIOTest.Create(AManager: Teventloop);
  44. begin
  45. inherited Create;
  46. FManager := AManager;
  47. Input := THandleStream.Create(StdInputHandle);
  48. AManager.SetIONotify(Input.Handle, @InputAvailable, nil);
  49. MyTimer:=AManager.AddTimerNotify(1000,true,@TimerHandler,nil);
  50. end;
  51. destructor TASIOTest.Destroy;
  52. begin
  53. Input.Free;
  54. end;
  55. var
  56. AsyncIOManager: Teventloop;
  57. app: TASIOTest;
  58. begin
  59. WriteLn('Exit with "q", use "t" to stop the timer handler');
  60. AsyncIOManager := Teventloop.Create;
  61. app := TASIOTest.Create(AsyncIOManager);
  62. AsyncIOManager.Run;
  63. app.Free;
  64. AsyncIOManager.Free;
  65. end.