fork download
  1. #include <functional>
  2. #include <iostream>
  3. #include <thread>
  4.  
  5. using namespace std::chrono_literals;
  6.  
  7. using TypeCallbackRun = std::function<void (int)>;
  8. using TypeCallbackBreak = std::function<bool (int)>;
  9. using TypeCallbackFinish = std::function<void ()>;
  10.  
  11. // ───────────────────────────────────────────────────────────────────────────────────
  12.  
  13. class Producer {
  14. TypeCallbackRun CallbackRun;
  15. TypeCallbackBreak CallbackBreak;
  16. TypeCallbackFinish CallbackFinish;
  17. public:
  18. Producer() {}
  19. void Run() {
  20. std::cout << "Run started (10 times) ...\n";
  21. for (int i = 0; i < 10; ++i) {
  22. if (CallbackBreak && CallbackBreak(i)) break;
  23. if (CallbackRun) CallbackRun(i);
  24. std::this_thread::sleep_for(100ms);
  25. }
  26. if (CallbackFinish) CallbackFinish();
  27. std::cout << "\nRun finished\n";
  28. }
  29. void SetCallbacks(TypeCallbackRun r, TypeCallbackBreak b, TypeCallbackFinish f) {
  30. CallbackRun = r;
  31. CallbackBreak = b;
  32. CallbackFinish = f;
  33. }
  34. };
  35.  
  36. // ───────────────────────────────────────────────────────────────────────────────────
  37.  
  38. class Consumer {
  39. public:
  40. bool Ready = false;
  41. void ProcCallbackRun(const int i) {
  42. std::cout << i << " ";
  43. }
  44. bool ProcCallbackBreak(const int i) {
  45. return i > 4;
  46. }
  47. void ProcCallbackFinish() {
  48. Ready = true;
  49. }
  50. };
  51.  
  52. // ───────────────────────────────────────────────────────────────────────────────────
  53.  
  54. int main() {
  55. Producer Prod;
  56. Consumer Cons;
  57. // так
  58. //
  59. Prod.SetCallbacks(
  60. std::bind(&Consumer::ProcCallbackRun, &Cons, std::placeholders::_1),
  61. std::bind(&Consumer::ProcCallbackBreak, &Cons, std::placeholders::_1),
  62. std::bind(&Consumer::ProcCallbackFinish, &Cons)
  63. );
  64. //
  65. // ну или так
  66. //
  67. // Prod.SetCallbacks(
  68. // [&](int i) {
  69. // Cons.ProcCallbackRun(i);
  70. // },
  71. // [&](int i) {
  72. // return Cons.ProcCallbackBreak(i);
  73. // },
  74. // [&]() {
  75. // Cons.ProcCallbackFinish();
  76. // });
  77. Prod.Run();
  78. return 0;
  79. }
  80.  
Success #stdin #stdout 0s 4416KB
stdin
Standard input is empty
stdout
Run started (10 times) ...
0 1 2 3 4 
Run finished