Qt worker thread


/ Published in: C++
Save to your folder(s)

Рабочий поток интерпретатора конечного автомата. C++/Qt.


Copy this code and paste it in your HTML
  1. #include "Worker.h"
  2. #include "Draft.h"
  3. #include "Tags.h"
  4. #include "ChannelFactory.h"
  5. #include "Logger.h"
  6. #include "MainModule.h"
  7.  
  8.  
  9. Worker::Worker(const QString& algorithmPath, int stopTimeout, MainModule* parent)
  10. : _stopTimeout(stopTimeout)
  11. , _draft(Draft::FromFile(&QFile(algorithmPath)))
  12. , _stop(false)
  13. , _filters(parent->GetFilterMapPtr())
  14. {
  15. connect(this, SIGNAL(failure()), parent, SLOT(OnFailure()));
  16. connect(this, SIGNAL(success()), parent, SLOT(OnSuccess()));
  17.  
  18. logger.addn(Draft::LastError());
  19. _draft ? emit success() : emit failure();
  20. }
  21.  
  22. void Worker::ConstructChannels(const StringMapMap& channels)
  23. {
  24. Q_FOREACH(const QString& channelName, channels.keys())
  25. _channels[channelName] = ChannelFactory::Instance().CreateChannel(channels[channelName][tag::AType], channels[channelName]);
  26. }
  27.  
  28. bool Worker::EstablishConnections()
  29. {
  30. logger.addn("Connecting...");
  31.  
  32. for (QList<ISimpleChannelPtr> channels = _channels.values(); !_stop && !channels.isEmpty();)
  33. {
  34. if (channels.first()->IsOpened() || channels.first()->Open())
  35. {
  36. logger.addn("Channel connected: " + channels.first()->Info());
  37. channels.removeFirst();
  38. }
  39. }
  40.  
  41. return !_stop;
  42. }
  43.  
  44. void Worker::run()
  45. {
  46. if (_draft)
  47. {
  48. ConstructChannels(_draft->Channels());
  49. _machine.reset(new Machine(_draft, _channels, *_filters));
  50. connect(_machine.get(), SIGNAL(stopped()), this, SLOT(quit()), Qt::DirectConnection); //exit thread's event loop when machine stops
  51.  
  52. while(!_stop && EstablishConnections())
  53. {
  54. _machine->Start();
  55. exec();
  56. }
  57. }
  58. }
  59.  
  60. void Worker::Stop(bool gentle)
  61. {
  62. logger.addn(gentle ? "Exit signal." : "Abort signal.");
  63. _stop = true;
  64.  
  65. if (_machine)
  66. _machine->Stop(gentle);
  67.  
  68. if (!wait(_stopTimeout))
  69. {
  70. terminate();
  71. logger.addn("Worker terminated.");
  72. }
  73.  
  74. logger.addn("Worker stopped.");
  75. }

Report this snippet


Comments

RSS Icon Subscribe to comments

You need to login to post a comment.