You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

asynwait.cpp 1.5 kB

8 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "asynwait.h"
  2. #include <thread>
  3. #include <unistd.h>
  4. AsynWait::AsynWait()
  5. {
  6. }
  7. void AsynWait::start(int precision)
  8. {
  9. if (mStarted == true)
  10. return;
  11. mStarted=true;
  12. mPrecision = precision;
  13. thread thd(&AsynWait::run, this);
  14. mThd.swap(thd);
  15. }
  16. void AsynWait::stop()
  17. {
  18. mStarted=false;
  19. mThd.join();
  20. }
  21. void AsynWait::addWaitPack(IdType packetId, AsynWait::OnWaitTimeout onTimeout, int msTimeo)
  22. {
  23. WaitPack pack;
  24. pack.id = packetId;
  25. pack.handler = onTimeout;
  26. pack.timeo = time_point_cast<milliseconds>(system_clock::now()) + milliseconds(msTimeo);
  27. mPacksMutex.lock();
  28. mWaitPacks.push_back(pack);
  29. mPacksMutex.unlock();
  30. }
  31. void AsynWait::clearWaitPack(IdType packetId)
  32. {
  33. mPacksMutex.lock();
  34. mWaitPacks.remove_if([packetId](WaitPack pack){
  35. return pack.id = packetId;
  36. });
  37. mPacksMutex.unlock();
  38. }
  39. void AsynWait::run()
  40. {
  41. list<WaitPack> timeos;
  42. while (mStarted) {
  43. usleep(mPrecision*1000);
  44. timeos.clear();
  45. auto cur = system_clock::now();
  46. mPacksMutex.lock();
  47. mWaitPacks.remove_if([&cur, &timeos](const WaitPack& pack){
  48. if (cur > pack.timeo)
  49. {
  50. timeos.push_back(pack);
  51. return true;
  52. }
  53. return false;
  54. });
  55. mPacksMutex.unlock();
  56. if (!timeos.empty())
  57. {
  58. for (auto& pack : timeos)
  59. pack.handler(pack.id);
  60. }
  61. }
  62. }

mac下的“飞秋”大多数只是飞鸽传书协议,而且未发现令人满意的开源项目,所以基于c++与qt实现了基础的飞秋协议。

Contributors (1)