{"id":260884,"date":"2015-07-07T17:29:02","date_gmt":"2015-07-07T13:29:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=260884"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=260884","title":{"rendered":"Qt Framework: \u043f\u043e\u0442\u043e\u043a\u0438, \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442, \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 = QThread + QStateMashine + libUSB"},"content":{"rendered":"<p>     \t\u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043a \u044d\u0442\u0430\u043f\u0443, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u0430\u043c. \u0421\u0435\u0439\u0447\u0430\u0441 \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u0435\u0437 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u0438\u043b\u0438 \u0438\u043d\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 (framework). <br \/>  \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u0437 \u043d\u0438\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 <a href=\"http:\/\/www.qt.io\/qt-framework\/\">Qt Framework<\/a>.<\/p>\n<p>  \u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043c\u0435\u0442\u043e\u0434\u0430\u0445 Qt \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p>  \u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u041f\u041e \u043d\u0430 Qt Framework \u043e\u0433\u0440\u043e\u043c\u043d\u043e. \u041b\u044e\u0434\u0438 \u043e\u0445\u043e\u0442\u043d\u043e \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430\u0432\u044b\u043a\u0430\u043c\u0438 \u0438 \u043f\u0440\u0438\u0451\u043c\u0430\u043c\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043d\u0438\u0433 \u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0438\u0437\u044f\u0449\u043d\u043e\u0433\u043e \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438.<br \/>  \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0432\u0441\u0451 \u0443\u0436\u0435 \u0440\u0435\u0448\u0435\u043d\u043e. \u0427\u0442\u043e \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c?<br \/>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u044e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430. \u041f\u0440\u0438\u0437\u043d\u0430\u044e\u0441\u044c, \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043b \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0441 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0432 \u0441\u0435\u0442\u0438. <br \/>  \u0415\u0441\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u0441 \u0438\u0434\u0435\u0435\u0439, \u0447\u0442\u043e, \u043f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e, \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0446\u0435\u043d\u043d\u0435\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0431\u0443\u0434\u0443 \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0434.<\/p>\n<p>  \u0412\u044b\u0440\u0430\u0436\u0430\u044e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0410. \u041d. \u0411\u043e\u0440\u043e\u0432\u0441\u043a\u043e\u043c\u0443 \u0437\u0430 \u043a\u043d\u0438\u0433\u0443 <a href=\"http:\/\/www.ozon.ru\/context\/detail\/id\/7449666\/\">\u00abQt4.7+.\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 C++\u00bb<\/a>. <br \/>  \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043a \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044e!<\/p>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<h3>\u041c\u043d\u0435 \u0442\u0430\u043a \u0443\u0434\u043e\u0431\u043d\u043e.<\/h3>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412 \u0441\u0432\u043e\u0438\u0445 \u043a\u043e\u0434\u0430\u0445 \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u043c\u0438:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>#define IS_ZERRO(VALUE)   (0 == (VALUE)) #define MORE_ZERRO(VALUE) (0 &lt; (VALUE)) #define LESS_ZERRO(VALUE) (0 &gt; (VALUE)) #define NOT_ZERRO(VALUE)  (!IS_ZERRO(VALUE))  #define IS_NULL(PTR)      (Q_NULLPTR == (PTR)) #define NOT_NULL(PTR)     (!IS_NULL(PTR))  #define BETWEEN(VALUE,LOW,HIGH) ( ((VALUE) &gt; (LOW)) && ((VALUE) &lt; (HIGH)) ) #define BETWEEN_L(VALUE,LOW,HIGH) (((VALUE) &gt;= (LOW)) && ((VALUE) &lt; (HIGH))) #define BETWEEN_H(VALUE,LOW,HIGH) (((VALUE) &gt; (LOW)) && ((VALUE) &lt;= (HIGH))) #define BETWEEN_ALL(VALUE,LOW,HIGH) (((VALUE) &gt;= (LOW)) && ((VALUE) &lt;= (HIGH)))  #define EQUAL(VALUE,EXPR) ((VALUE) == (EXPR)) #define NOT_EQUAL(VALUE,EXPR) (!EQUAL(VALUE,EXPR)) <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041d\u0435 \u0431\u0443\u0434\u0443 \u0441\u043f\u043e\u0440\u0438\u0442\u044c \u043e \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438 \u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u041c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043a\u043e\u0434 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442, \u0441\u043a\u0430\u0436\u0435\u043c, \u00ab\u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0442\u043e\u043d\u00bb \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439.<br \/>  \u041f\u0440\u043e\u0441\u0442\u043e, \u043c\u043d\u0435 \u0442\u0430\u043a \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<p>  \u041d\u0430\u0447\u043d\u0451\u043c.<\/p>\n<h2>\u0428\u0430\u0433 1. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u043f\u043e\u0442\u043e\u043a\u0430\u0445 \u00ab\u043d\u0430 \u043f\u0430\u043b\u044c\u0446\u0430\u0445\u00bb.<\/h2>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0443\u0434\u0430\u0440\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0441\u043b\u043e\u0432\u0435, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c. \ud83d\ude42<br \/>  \u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0442\u043e\u043a\u043e\u0432 Qt \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439:  <\/p>\n<ul>\n<li>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f;<\/li>\n<li>\u0412\u043e\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438.<\/li>\n<\/ul>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u044b-\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"http:\/\/doc.qt.io\/qt-5\/qthread.html\">QThread<\/a> (<a href=\"http:\/\/doc.crossplatform.ru\/qt\/4.7.x\/html-qt\/qthread.html\">\u0440\u0443\u0441.<\/a>), \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u044b\u0445 \u0432\u043e\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<br \/>  \u041a\u0430\u0436\u0434\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"http:\/\/doc.qt.io\/qt-5\/qthread.html\">QThread<\/a> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0426\u0438\u043a\u043b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0449\u0438\u0449\u0451\u043d\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c <i>QThread::exec()<\/i>. \u0417\u0430\u043f\u0443\u0441\u043a \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0430 <i>QThread::start()<\/i>. \u041c\u0435\u0442\u043e\u0434 \u0441\u0442\u0430\u0440\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0449\u0438\u0449\u0451\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <i>QThread::run()<\/i>. \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043c\u0435\u0442\u043e\u0434 <i>run()<\/i> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <i>exec()<\/i> \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 QThread.<br \/>  \u041c\u0435\u0442\u043e\u0434 <i>run()<\/i> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e (\u043d\u0430\u0437\u043e\u0432\u0451\u043c \u0435\u0433\u043e, \u0440\u0430\u0431\u043e\u0447\u0438\u043c) \u043f\u043e\u0442\u043e\u043a\u0430. \u0410\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 QThread.<\/p>\n<p>  \u041a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u043e\u0442\u043e\u043a? <br \/>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 UNIX-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <i>pthread<\/i>. \u0412 \u0441\u0435\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432 \u043e \u043d\u0435\u0439. <br \/>  \u041c\u0435\u0442\u043e\u0434 <i>QThread::start()<\/i> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u0437\u043e\u0432\u043e\u043c <i>pthread_create()<\/i>, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0435\u043c\u0443 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u043c\u0435\u0442\u043e\u0434 <i>QThreadPrivate::start ()<\/i>, \u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <i>arg<\/i> \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442-\u0441\u0435\u0431\u044f. <\/p>\n<p>  \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u043a\u043e\u0434 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <\/p>\n<pre><code>QThreadPrivate::start () {     . . .     QThreadData *data = QThreadData::get2(thr);     . . . } <\/code><\/pre>\n<p>  \u041e\u0442\u0441\u043b\u0435\u0434\u0438\u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0441\u0432\u044f\u0437\u0435\u0439, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <i>QObject::moveToThread(QObject*)<\/i> \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u044b \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u0442 \u043f\u0443\u043b \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 <i>QThreadData<\/i> \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430.<br \/>  \u041d\u0435\u043c\u0430\u043b\u043e \u0434\u0438\u0441\u043a\u0443\u0441\u0441\u0438\u0439 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 Qt \u0432\u0435\u0434\u0443\u0442\u0441\u044f \u043d\u0430 \u0442\u0435\u043c\u0443, \u0447\u0442\u043e \u0436\u0435 \u043b\u0443\u0447\u0448\u0435: \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u0435\u0442\u043e\u0434\u043e\u043c <i>QObject::moveToThread ()<\/i> \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0437\u0430\u0449\u0438\u0449\u0451\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <i>QThread::run()<\/i>?<br \/>  \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 \u043c\u0435\u0442\u043e\u0434 <i>QThread::run()<\/i>, \u0437\u043d\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0435\u043c, \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u0437 \u0432\u043d\u0435, \u0442.\u043a. \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0432 \u0441\u0442\u0435\u043a\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <i>run()<\/i> (\u0445\u043e\u0442\u044f \u0438 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438). <br \/>  \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\u044b\u0435 \u0436\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u043f\u0443\u043b\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0442\u044f\u043d\u0443\u0442 \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u0432\u0441\u0435 \u0441\u0432\u043e\u0438 <i><a href=\"http:\/\/doc.qt.io\/qt-5\/qmetaobject.html\">QMetaObject<\/a>::Connection<\/i>-\u044b.<\/p>\n<p>  \u041f\u043e\u043c\u043d\u0438\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c, \u0438 \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435.<\/p>\n<p>  \u0423\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u0448\u0435\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0438\u0441\u0443\u043d\u043a\u043e\u043c<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/828\/b0f\/222\/828b0f2220b34de88e8e30acf3e9a095.png\"\/><\/p>\n<h3>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f QThread.<\/h3>\n<p>  \u041f\u043e\u043c\u0438\u043c\u043e <i>QThread<\/i>, Qt \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043d\u0430\u0431\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0431\u043e\u043b\u0435\u0435 \u00ab\u0432\u044b\u0441\u043e\u043a\u043e\u0433\u043e\u00bb \u0443\u0440\u043e\u0432\u043d\u044f.<br \/>  \u041e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438\u043c\u0435\u043d <a href=\"http:\/\/doc.qt.io\/qt-5\/qtconcurrent-index.html\">QtConcurrent<\/a>. \u041a\u043b\u0430\u0441\u0441\u044b \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u0435\u0440\u0443\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u0442\u044c \u0432 \u043d\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u043d\u0435 \u0437\u0430\u0431\u043e\u0442\u0438\u0442\u044c\u0441\u044f \u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0438 \u043e\u0447\u0438\u0441\u0442\u043a\u0435 \u043f\u0430\u043c\u044f\u0442\u0438. \u041d\u043e \u0435\u0441\u0442\u044c \u0438\u0437\u0434\u0435\u0440\u0436\u043a\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043b\u0430\u0441\u0441 <a href=\"http:\/\/doc.qt.io\/qt-5\/qrunnable.html\">QRunnable<\/a> \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u043c <a href=\"http:\/\/doc.qt.io\/qt-5\/qobject.html\">QObject<\/a>, \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f.<br \/>  \u0414\u0443\u043c\u0430\u044e, \u043e\u043d\u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a\u0438\u0445 \u043b\u0438\u0431\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439, \u0433\u0434\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0430\u0431\u043e\u0440 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<br \/>  \u0427\u0430\u0441\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u0446\u0438\u043a\u043b\u044b \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u0438\u043b\u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0438\u0445 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u043b\u0438 GUI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0435 \u00ab\u0442\u043e\u0440\u043c\u043e\u0437\u0438\u043b\u0438\u00bb. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"http:\/\/libusb.sourceforge.net\/api-1.0\/api.html\">libUSB<\/a>, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u0430 \u043a\u0430\u043a \u0440\u0435\u0430\u043a\u0446\u0438\u044f \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0438\u043b\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c, \u0437\u0430\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u043c \u0432 \u0446\u0438\u043a\u043b \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u0434\u0443\u043c\u0430\u044e, \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <i>QThread<\/i> \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043e.<\/p>\n<h4>\u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435.<\/h4>\n<p>  \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u043e \u0432 \u0441\u0435\u0442\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u0438\u0439 \u00ab\u0444\u0438\u043d\u0442 \u0443\u0448\u0430\u043c\u0438\u00bb \u043f\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u043e\u0442\u043e\u043a, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e  <\/p>\n<pre><code>MyThread:: MyThread () : QThread() {    moveToThread(this);  }<\/code><\/pre>\n<p>  \u041d\u0435 \u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u044d\u0442\u043e\u0433\u043e! \u0425\u043e\u0442\u044f \u0431\u044b \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 QThread \u043a\u0430\u043a \u043d\u0430\u0434\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438. \u042d\u0442\u043e \u043f\u043e\u0445\u043e\u0436\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043d\u0430 \u0440\u044b\u0431\u0430\u043b\u043a\u0443, \u0437\u0430\u0431\u0440\u043e\u0441\u0438\u043b\u0438 \u0443\u0434\u043e\u0447\u043a\u0443, \u0434\u0430 \u0438 \u0441\u0430\u043c\u0443 \u0443\u0434\u043e\u0447\u043a\u0443 \u0442\u043e\u0436\u0435 \u0437\u0430\u0431\u0440\u043e\u0441\u0438\u043b\u0438 \u0432 \u0440\u0435\u043a\u0443\u2026<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u043e\u0442\u043e\u043a\u0430, \u0432\u044b, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0451\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <i>QObject::moveToThread()<\/i> \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u0432\u043d\u0435 \u043f\u043e\u0442\u043e\u043a\u0430. \u041c\u044b \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0451\u043d\u043d\u043e\u043c\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0435\u0439 <i>QMetaObject::Connection<\/i>.<br \/>  \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0438 \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0430, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a, \u0447\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438 \u043d\u0435 \u0431\u044b\u043b\u043e: \u0430\u0434\u0440\u0435\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f.<br \/>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0434\u043d\u043e \u0438\u0437 \u043e\u0442\u043b\u0438\u0447\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0438 \u043f\u043e\u0442\u043e\u043a\u0430. \u041a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443 \u041e\u0421 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043f\u0443\u043b \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0431\u0449\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c \u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c, \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0448\u0438\u043c. \u0417\u043d\u0430\u0447\u0438\u0442, \u0432\u0441\u0451 \u0432 \u043d\u043e\u0440\u043c\u0435 \u2013 \u0430\u0434\u0440\u0435\u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432 \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.<br \/>  \u041c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0430\u0434\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u0447\u0435\u043c-\u0442\u043e \u0441\u0440\u043e\u0434\u043d\u0438 \u00ab\u0443\u043c\u043d\u043e\u043c\u0443\u00bb \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e \u0442\u0438\u043f\u0430 <a href=\"http:\/\/www.cplusplus.com\/reference\/memory\/auto_ptr\/\">std::auto_ptr<\/a>, \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u044f\u044e\u0449\u0435\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u043b\u0438\u0440\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e.<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>\/\/\u041d\u0430 \u043f\u043b\u0430\u043d\u0435\u0442\u0435 \u0417\u0435\u043c\u043b\u044f (\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 main()) \u043d\u0435\u043a\u0430\u044f \u0434\u0440\u0435\u0432\u043d\u044f\u044f \u0446\u0438\u0432\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u0430\u043b\u0430 \u0433\u043e\u0440\u043e\u0434 \u041a\u0430\u0444\u0430  \/\/ \u0441 \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c\u0438. City\/*::QObject*\/* city = City(); city-&gt;setObjectName(\u201c\u041a\u0430\u0444\u0430\u201d); std::out &lt;&lt; qPrintable(city) &lt;&lt; std::endl; . . . \/\/\u0427\u0435\u0440\u0435\u0437 \u0432\u0435\u043a\u0430 \u0446\u0438\u0432\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u0442\u0440\u0430\u0442\u0438\u043b\u0430 \u0441\u0432\u043e\u0451 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u043d\u0430 \u0433\u043e\u0440\u043e\u0434, \u0438 \u0433\u043e\u0440\u043e\u0434 \u0441\u0442\u0430\u043b \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442\u044c \u041a\u0440\u044b\u043c\u0441\u043a\u043e\u043c\u0443 \u0445\u0430\u043d\u0441\u0442\u0432\u0443, QThread* Girey = new QThread();  city-&gt;setParent(Q_NULLPTR);  city-&gt;moveToThread(Girey);  \/\/  \u043d\u043e \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0433\u043e\u0440\u043e\u0434\u0430 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438\u0441\u044c. std::out &lt;&lt; qPrintable(city) &lt;&lt; std::endl; . . . \/\/ \u0427\u0442\u043e \u0431\u044b \u043d\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e  city-&gt;setParent(Q_NULLPTR);  city-&gt;moveToThread(RussionImperia);  . . .  city-&gt;setParent(Q_NULLPTR);  city-&gt;moveToThread(USSR); . . . city-&gt;setObjectName(\u201c\u0424\u0435\u043e\u0434\u043e\u0441\u0438\u044f\u201d);  \/\/ \u0438 \u0442.\u0434.  <\/code><\/pre>\n<p>  \u0413\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u0433\u043e\u0440\u043e\u0434\u0430 (<i>city<\/i>) \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0417\u0435\u043c\u043b\u0438 (<i>main()<\/i>) \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f, \u043d\u043e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 (<i>*city<\/i>) \u0438\u0437\u043c\u0435\u043d\u0447\u0438\u0432\u0430.  <\/div>\n<\/div>\n<p>  \u041d\u0430 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0431\u0435\u0433\u043b\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <i>QThread<\/i> \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e \u0442\u0440\u044e\u043a\u0430 \u043f\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u043c\u0443 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u043f\u043e\u0442\u043e\u043a\u0430 \u0438\u0437 \u043f\u043e \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043b\u044e\u0431\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0432\u044b\u0445\u043e\u0434\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.<\/p>\n<h2>\u0428\u0430\u0433 2. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0430.<\/h2>\n<p>  \u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u043f\u043e\u0442\u043e\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f.<br \/>  \u041e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u043e \u0438\u043b\u0438 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u0438\u043b\u0438, \u0432\u043e\u043e\u0431\u0449\u0435, \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0438\u0442\u044c \u0441\u0432\u043e\u0451 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435.<br \/>  \u041d\u0435 \u0431\u0443\u0434\u0443 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c: \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043f\u043e \u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041f\u0440\u043e\u0441\u0442\u043e, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u0430, \u0438 \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u044d\u0442\u043e \u0441\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0442\u043e\u0447\u043a\u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u043d\u0435\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0442\u043e\u043a\u0430.<br \/>  \u041c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u0441\u0430\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e \u0441 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u0427\u0430\u0441\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u043e\u043b\u043d\u043e\u043c\u0443 \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u044e \u043f\u043e\u0442\u043e\u043a\u0430. \u0414\u0430\u0436\u0435 \u043c\u0435\u0442\u043e\u0434 <i>QThread::terminate()<\/i> \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u043f\u0443\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u0422\u0430\u043a \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0437\u043e\u043c\u0431\u0438-\u043f\u043e\u0442\u043e\u043a\u0438. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 \u041e\u0421 \u0441\u0430\u043c\u0430 \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043d\u043e \u0441 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u044d\u0442\u043e\u0442 \u043d\u043e\u043c\u0435\u0440 \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0451\u0442, \u0442.\u043a. \u0437\u0430 \u0438\u0445 \u0436\u0438\u0437\u043d\u044c \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a, \u0430 \u043d\u0435 \u044f\u0434\u0440\u043e \u041e\u0421. <br \/>  \u041e\u0434\u043d\u0438\u043c \u0441\u043b\u043e\u0432\u043e\u043c, \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0435 \u0437\u043d\u0430\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u043c\u0435\u0441\u0442\u0430 \u0442\u043e\u0447\u0435\u043a \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u043a\u043e\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f.<br \/>  \u0417\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u0435\u043d \u043d\u0435\u043a\u0438\u0439 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a \u2013 \u043e\u0431\u0432\u0435\u0440\u043a\u0430 \u201chelper\u201d \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e\u0442\u043e\u043a\u0430. \u041f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0442\u0440\u044e\u043a\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043e \u0432 Qt.<\/p>\n<p>  \u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e \u043f\u043e\u044f\u0441\u043d\u044e:<br \/>  \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u043a\u043b\u0430\u0441\u0441 \u043f\u043e\u0442\u043e\u043a\u0430 <i>FWThread<\/i>:  <\/p>\n<pre><code>class FWThread : public QThread  { } <\/code><\/pre>\n<p>  \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u043a\u043b\u0430\u0441\u0441 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u0430  <\/p>\n<pre><code>class FWThread_helper {   QPointer&lt;FWThread&gt; m_ext_thread; Public:     FWThread_helper(FWThread* aThread)       : m_ext_thread(aThread)     {       Q_ASSERT(NOT_NULL(m_ext_thread));     }      ~FWThread_helper()     {       if(!m_ext_thread.isNull())         m_ext_thread-&gt;deleteLater();     } } <\/code><\/pre>\n<p>  \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWThread<\/i>  <\/p>\n<pre><code>FWThread::~FWThread() {   quit ();   if(!wait (FW_THREAD_WAIT_TIMEOUT))   {     \/\/ \u043d\u0443, \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439...     terminate ();     if(!wait(FW_THREAD_WAIT_TIMEOUT))       exit(EXIT_FAILURE);   } } <\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u043c\u0435\u0442\u043e\u0434 QThread::run ()  <\/p>\n<pre><code>void FWThread::run() {   FWThread_helper* v_helper = new FWThread_helper(this);  \/\/\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0442\u043e\u043a\u0430    m_helper.clear (); } <\/code><\/pre>\n<p>  \u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432 \u0442\u0435\u043b\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <i>run()<\/i>? \u0427\u0442\u043e \u0431\u044b \u043d\u0438 \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c <i>v_helper<\/i> \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043b\u0438\u0431\u043e \u043f\u043e <i>m_helper.clear ()<\/i>, \u043b\u0438\u0431\u043e \u043f\u043e \u043e\u0447\u0438\u0441\u0442\u043a\u0435 \u0441\u0442\u0435\u043a\u0430 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 <i>run()<\/i> \u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. <br \/>  \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0442\u043e\u043a\u0430 <i>FWThread.<\/i> \u041f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438\u043b\u0438 \u0432\u0430\u0448 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u0435\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0443, \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0443\u0448\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c <i>QObject::deleteLater()<\/i>.<\/p>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443   <\/p>\n<pre><code>Q_ASSERT(NOT_NULL(m_ext_thread)); <\/code><\/pre>\n<p>  \u0432 \u0442\u0435\u043b\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWThread_helper<\/i>. \u041a\u043b\u0430\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043d\u0435\u043f\u0443\u0441\u0442\u043e\u0433\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u043f\u043e\u0442\u043e\u043a. \u0414\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0443\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438.<\/p>\n<p>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c   <\/p>\n<pre><code>void FWThread::run() {   FWThread_helper* v_helper = new FWThread_helper(this);   QException e;      QT_TRY    {     e.raise();   } QT_CATCH(QException& e) {     qDebug() &lt;&lt; qPrintable(e.what ());   }   m_helper.clear (); } <\/code><\/pre>\n<p>  \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0437\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u043f\u043e\u043d\u044f\u0442\u043d\u043e.<\/p>\n<h2>\u0428\u0430\u0433 3. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430.<\/h2>\n<p>  \u041e\u0434\u043d\u0430 \u0438\u0437 \u043f\u043e\u043b\u0435\u0437\u043d\u0435\u0439\u0448\u0438\u0445, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0432 Qt Framework \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u043c \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 (\u0434\u0430\u043b\u0435\u0435 \u041a\u0410). \u041a\u0410 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0438 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 boost, \u043d\u043e \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0451\u0442 \u043e Qt.<\/p>\n<p>  \u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043e\u0440\u0438\u0435\u0439 Qt \u041a\u0410 \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Qt \u0438\u043b\u0438 \u0441\u0430\u0439\u0442\u0430 <a href=\"http:\/\/doc.crossplatform.ru\/qt\/4.8.x\/html-qt\/statemachine-api.html\">crossplatform.ru<\/a><br \/>  <b>\u041a\u0430\u043a\u0438\u043c \u0436\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u041a\u0410 \u0438 \u043f\u043e\u0442\u043e\u043a?<\/b><br \/>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0451\u0434, \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u043c\u043d\u043e\u044e \u043a\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 <i>QThread::run()<\/i>:  <\/p>\n<pre><code>void FWThread::run() {   FWThread_helper* v_helper = new FWThread_helper(this);   m_helper = v_helper;    InternalRun ();    if(IsValid ())   {     BeforeMachineStart ();      \/\/\/ \u0417\u0430\u043f\u0443\u0441\u043a \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u041a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0430 @sa Machine ().     Machine ()-&gt;start ();      \/\/\/ \u0417\u0430\u043f\u0443\u0441\u043a \u0446\u0438\u043a\u043ba \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043e\u0442\u043e\u043a\u0430. =&gt; \u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u041a\u0410.     BaseClass::exec ();   }   else   {     if(!IsError ()) SetError ();     exit (FW_ERR_THREAD_INCOMPLETE);   }    m_helper.clear (); } <\/code><\/pre>\n<p>  \u0412\u043e \u0432\u0441\u0435\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445, \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWThread(::QThread)<\/i>, \u044f \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e \u043b\u0438\u0448\u044c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0440\u0443\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <i>FWThread::BeforeMachineStart()<\/i>. \u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f!<br \/>  \u041a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 BeforeMachineStart() \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430 <i>FWThread<\/i>\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u041a\u0410 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 <i>QThread::run()<\/i> \u043b\u0438\u0448\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430, \u0430 \u0441\u0430\u043c \u043f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430. \u041f\u0440\u0438\u0447\u0451\u043c, \u043f\u0440\u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c <i>QObject::deleteLater()<\/i> \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWThread<\/i>, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041a\u0410 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043f\u043e\u0442\u043e\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <i>FWThread::start()<\/i> \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043d\u043e\u0432\u043e \u0441 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u041a\u0410!<\/p>\n<p>  \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u043a\u0430\u043a \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c.<\/p>\n<p>  \u0412 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Qt \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043a\u043b\u0430\u0441\u0441\u043e\u043c <a href=\"http:\/\/doc.qt.io\/qt-5\/qstatemachine.html\">QStateMachine<\/a> (<a href=\"http:\/\/doc.crossplatform.ru\/qt\/4.8.x\/html-qt\/qstatemachine.html\">\u0440\u0443\u0441.<\/a>), \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 <a href=\"http:\/\/doc.qt.io\/qt-5\/qstate.html\">QState<\/a> (<a href=\"http:\/\/doc.crossplatform.ru\/qt\/4.8.x\/html-qt\/qstate.html\">\u0440\u0443\u0441.<\/a>), <a href=\"http:\/\/doc.qt.io\/qt-5\/qhistorystate.html\">QHistoryState<\/a> (<a href=\"http:\/\/doc.crossplatform.ru\/qt\/4.8.x\/html-qt\/qhistorystate.html\">\u0440\u0443\u0441.<\/a>), <a href=\"http:\/\/doc.qt.io\/qt-5\/qfinalstate.html\">QFinalState<\/a> (<a href=\"http:\/\/doc.crossplatform.ru\/qt\/4.8.x\/html-qt\/qfinalstate.html\">\u0440\u0443\u0441.<\/a>). \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 <a href=\"http:\/\/doc.qt.io\/qt-5\/qeventtransition.html\">QEventTransition<\/a> (<a href=\"http:\/\/doc.crossplatform.ru\/qt\/4.8.x\/html-qt\/qeventtransition.html\">\u0440\u0443\u0441.<\/a>) \u0438 <a href=\"http:\/\/doc.qt.io\/qt-5\/qsignaltransition.html\">QSignalTransition<\/a> (<a href=\"http:\/\/doc.crossplatform.ru\/qt\/4.8.x\/html-qt\/qsignaltransition.html\">\u0440\u0443\u0441.<\/a>). <br \/>  \u0412\u0441\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u044b \u043d\u0430 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u0422\u0430\u043a QState \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <a href=\"http:\/\/doc.qt.io\/qt-5\/qabstractstate.html\">QAbstractState<\/a> (<a href=\"http:\/\/doc.crossplatform.ru\/qt\/4.8.x\/html-qt\/qabstractstate.html\">\u0440\u0443\u0441.<\/a>). \u041a\u043b\u0430\u0441\u0441 \u041a\u0410 <i>QStateMachine<\/i> \u2013 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u0430\u044f \u043e\u0442 QState. \u041a\u043b\u0430\u0441\u0441\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0432\u0435\u0434\u0443\u0442 \u043d\u0430\u0447\u0430\u043b\u043e \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"http:\/\/doc.qt.io\/qt-5\/qabstracttransition.html\">QAbstractTransition<\/a> (<a href=\"http:\/\/doc.crossplatform.ru\/qt\/4.8.x\/html-qt\/qabstracttransition.html\">\u0440\u0443\u0441.<\/a>).<br \/>  \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e Qt \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u041a\u0410, \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0442\u0440\u044e\u043a\u043e\u0432 \u043f\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u041a\u0410.<br \/>  \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <a href=\"http:\/\/doc.crossplatform.ru\/qt\/4.8.x\/html-qt\/statemachine-api.html\">\u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u0438 \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u041a\u0410 Qt \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435<\/a><br \/>  \u041f\u0440\u043e\u0447\u0442\u0438\u0442\u0435. \u042d\u0442\u043e, \u043f\u0440\u043e\u0441\u0442\u043e, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<p>  \u0418\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Qt \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u041a\u0410 \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0441\u0445\u0435\u043c\u0443, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u0440\u0438\u0441\u0443\u043d\u043a\u0443 <a href=\"http:\/\/doc.crossplatform.ru\/qt\/4.8.x\/html-qt\/statemachine-api.html#using-history-states-to-save-and-restore-the-current-state\">\u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/9cb\/87f\/068\/9cb87f06862e4c2ebf2672fec76e86ae.png\"\/><\/p>\n<p>  \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044f \u043a\u043b\u0430\u0441\u0441\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432, \u044f \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <i>QSignalTransition<\/i>. \u041b\u044e\u0431\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043f\u043e\u0441\u044b\u043b \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430.<br \/>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u0443, \u043a\u043e\u0433\u0434\u0430 \u0443 \u0432\u0430\u0441 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u043f\u0440\u044f\u0442\u0430\u043d \u043a\u0430\u043a \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043d\u0435\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u041e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0442\u0430\u043a \u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c \u043a\u0430\u043a\u043e\u0433\u043e-\u043b\u0438\u0431\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0442.\u0434. \u0427\u0442\u043e\u0431\u044b \u043e\u0442\u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043e \u043f\u0435\u0440\u0435\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0438 \u0441\u0432\u044f\u0437\u0435\u0439 \u043c\u0435\u0442\u043e\u0434\u0430 <i>QObject::connect()<\/i> \u0432\u0433\u043b\u0443\u0431\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043f\u043e\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0435\u0442 \u0446\u0435\u043b\u0438. \u0418 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0440\u0435\u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u044b \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u0430\u043a \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0430 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c. <br \/>  \u041a\u0443\u0434\u0430 \u043f\u0440\u043e\u0449\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"http:\/\/doc.qt.io\/qt-5\/qevent.html\">QEvent<\/a> c \u043d\u0435\u043a\u0438\u043c\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <i>QStateMachine::postEvent()<\/i> \u0438\u043b\u0438 <i>QCoreApplication::postEvent()<\/i>. <\/p>\n<p>  \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043e\u0441\u043d\u043e\u0432\u043d\u043d\u044b\u0445 \u043d\u0430 \u043a\u043b\u0430\u0441\u0441\u0435 <i>QObject<\/i>.<br \/>  \u0422\u0430\u043a, \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0443 \u043c\u0435\u043d\u044f \u0437\u0432\u0443\u0447\u0438\u0442 \u043a\u0430\u043a <i>class FWIterm: public QObject<\/i>. <br \/>  \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u044f \u043d\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u044f \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u044e \u0438\u0445 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWItem<\/i>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u0432\u0435\u0441\u0442\u0438 \u043d\u0435\u043a\u0438\u0435 \u0444\u043b\u0430\u0433\u0438 \u0438 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438, \u043e\u0431\u0449\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0438 <i>FWItem<\/i> \u043c\u043e\u0433\u0443\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043d\u0430\u0431\u043e\u0440\u044b \u0444\u043b\u0430\u0433\u043e\u0432, \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWItem<\/i>.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0442\u043e, \u0447\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 FWItem \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442:<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>class FW_LIBRARY FWItem : public QObject {   private:     QPointer&lt;FWStateMachine&gt; m_machine;    protected:     \/**      * @brief \u041c\u0435\u0442\u043e\u0434 MachineExists \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e      * \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWStateMachine.      * @return \u0411\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:      * @value TRUE \u0410\u0432\u0442\u043e\u043c\u0430\u0442 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u0435 \u043a\u043b\u0430\u0441\u0441\u0430;      * @value FALSE \u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.      *\/     virtual bool     MachineExists () const { return !m_machine.isNull (); }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 Machine \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439      * \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 (\u041a\u0410) \u0442\u0438\u043f\u0430 @sa FWStateMachine.      * @return \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u041a\u0410.      *      * \u041a\u043b\u0430\u0441\u0441 @sa FWStateMachine \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u043c @sa QStateMachine.      *      * \u041c\u0435\u0442\u043e\u0434 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432 \u043a\u043b\u0430\u0441\u0441\u0430\u0445, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0445      * \u043e\u0442 @sa FWItem, \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043b\u0430\u0441\u0441\u0430\u0441 @sa FWStateMachine.      *\/     virtual FWStateMachine*     Machine () const;   public:     \/**      * @brief \u041c\u0435\u0442\u043e\u0434 SetMachine \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442.      * @param aMachine \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u041a\u0410.      *\/     void     SetMachine (FWStateMachine* aMachine); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u041a\u0410 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430 <i>FWItem<\/i>, \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0441\u044b\u043b\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e:  <\/p>\n<pre><code>if(item-&gt; MachineExists())   Machine()-&gt;PostEvent(FWEvent::OEI_Open); <\/code><\/pre>\n<p>  \u0413\u0434\u0435 <i>FWEvent::OEI_Open<\/i> \u043d\u0435\u043a\u0438\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWEvent<\/i>.<\/p>\n<p>  \u0414\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0438\u0434, <br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/763\/929\/c04\/763929c048d44a349e782a025e2248bc.png\"\/><br \/>  \u0433\u0434\u0435 <b>T<\/b><sub>(\u0441\u0438\u0433\u043d\u0430\u043b \u0442\u0438\u043f\u0430 FWEvent::Event::Type)<\/sub> \u2013 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u0435.<\/p>\n<p>  \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0432 \u043a\u043b\u0430\u0441\u0441 <i>FWStateMachine<\/i> \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043d\u0430\u0431\u043e\u0440 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <i>FWStateMachine:: AddBranch(&lt;\u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0438\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u044f&gt;&lt;\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435&gt;&lt;\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f&gt; == Q_NULLPTR);<\/i><br \/>  \u0414\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u041a\u0410 Qt \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0445\u0435\u043c\u044b \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0432\u043d\u0435\u0434\u0440\u0438\u043b \u0435\u0451 \u0432 \u0442\u0435\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWMachineState<\/i>, \u0441\u043e\u0437\u0434\u0430\u0432 \u0437\u0430\u0449\u0438\u0449\u0451\u043d\u043d\u044b\u0439 (<i>protected<\/i>) \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <i>Initialisation ()<\/i>.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0433\u043e:<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>void FWStateMachine::Initialisation() {   bool v_active = IsActive ();   if(v_active)     stop ();    \/\/\/ @name \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u041a\u0410   \/\/\/ @{   if(!StateGroupExists ())     m_state_group.reset (new FWState(this));    FWState* sIdle = new FWState(StateGroup ());   StateGroup ()-&gt;setInitialState (sIdle);   \/\/\/ @}    \/\/\/ @name \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u041a\u0410   \/\/\/ @{    if(!StateHistoryExists ())     \/\/ \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0446\u0435\u043b\u0438, \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435     \/\/ \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438-\u043f\u043e\u0442\u043e\u043c\u043a\u0435 @sa m_state_group (@sa QHistoryState::DeepHistory),      \/\/ \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0435     \/\/ \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0438\u0437 \u043d\u0435\u0433\u043e \u0432\u044b\u0448\u043b\u0438.     m_state_history.reset (new QHistoryState(QHistoryState::DeepHistory,StateGroup ()));    \/\/\/ @}    \/\/\/ @name \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438z \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u041a\u0410   \/\/\/ @{    if(!StateFinalExists ())     m_state_final.reset (new QFinalState(this));    \/\/\/ @}    \/\/\/ @name \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u041a\u0410   \/\/\/ @{    if(!StateErrorExists ())     m_state_error.reset (new FWState(this));    \/\/\/ @}    \/\/\/ @name \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u041a\u0410   \/\/\/ @{    AddBranch(FWEvent::ET_INTERNAL,FWInternalEvent::OEI_Stop,             StateGroup (), StateFinal ());   AddBranch(FWEvent::ET_INTERNAL,FWInternalEvent::OEI_Error,             StateGroup (), StateError ());    \/\/\/ @}    \/\/\/ @name \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b   \/\/\/ @{    FWState* sPause = new FWState(this);   AddBranch(FWEvent::ET_INTERNAL,FWInternalEvent::OEI_Pause,             StateGroup (), sPause);   AddBranch(FWEvent::ET_INTERNAL,FWInternalEvent::OEI_Resume,             sPause, StateHistory ());    \/\/\/ @}    \/\/\/ @name \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438   \/\/\/ @{   AddBranch(StateError (), StateFinal ());   \/\/\/ @}    \/\/\/ @name \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u041a\u0410   \/\/\/ @{    connect( sPause,&FWState::        entered,            this,  &FWStateMachine:: slot_OnPaused,            Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));   connect( sPause,&FWState::        exited,            this,  &FWStateMachine:: slot_OnResume,            Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));   connect( StateFinal (),&QFinalState::    entered,            this,         &FWStateMachine:: slot_OnStop,            Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));   connect( StateError (),&FWErrorState::   entered,            this,         &FWStateMachine:: slot_OnError,            Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));   connect( StateHistory(),&QHistoryState::defaultStateChanged,            this,          &FWStateMachine::slot_OnDefaultHistoryChanged,            Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));   \/\/\/ @}    if(NOT_EQUAL(initialState (),StateGroup ()))     setInitialState (StateGroup ());    StateGroup ()-&gt;   setObjectName(&quot;State GROUP&quot;);   StateHistory ()-&gt; setObjectName(&quot;State HISTORY&quot;);   StateError()-&gt;    setObjectName(&quot;State ERROR&quot;);   StateFinal()-&gt;    setObjectName(&quot;State FINAL&quot;);   sPause-&gt;          setObjectName(&quot;State PAUSE&quot;);   sIdle-&gt;           setObjectName(&quot;State IDLE&quot;);    if(v_active) start (); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430\u0445 \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWStateMachine<\/i> <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043b\u043e\u0442\u044b<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>  . . .   protected Q_SLOTS:      virtual void     slot_OnLoging ()     { qDebug() &lt;&lt; qPrintable(Q_FUNC_INFO); }      virtual void     slot_OnError ()     { qDebug() &lt;&lt; qPrintable(Q_FUNC_INFO); }      virtual void     slot_OnPaused ()     {       qDebug() &lt;&lt; qPrintable(Q_FUNC_INFO);       if(thread ())         thread ()-&gt;yieldCurrentThread ();       emit sign_Paused();     }      virtual void     slot_OnResume ()     {       qDebug() &lt;&lt; qPrintable(Q_FUNC_INFO);       emit sign_Resumed();     }      virtual void     slot_OnStop ()     {       qDebug() &lt;&lt; qPrintable(Q_FUNC_INFO);     }      virtual void     slot_OnDefaultHistoryChanged()     {       if(StateHistoryExists ())         if(NOT_NULL(StateHistory()-&gt;defaultState()))           qDebug() &lt;&lt; &quot;-H-&quot; &lt;&lt; StateHistory()-&gt;defaultState()-&gt;objectName();     } }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043a\u043b\u0430\u0441\u0441\u0443 <i>FWThread<\/i> \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043c\u0435\u0442\u043e\u0434 <i>Reconnect()<\/i>, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u0432 \u0442\u0435\u043b\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <i>run()<\/i>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">FWThread::Reconnect()<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>void FWThread::Reconnect() {   if(IsAutoDeleted ())     \/\/ \u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b     connect( this, &QThread::finished,              this, &QThread::deleteLater,              Qt::ConnectionType(Qt::QueuedConnection | Qt::UniqueConnection));    if(MachineExists ())   {     \/\/ \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0446\u0438\u043a\u043b\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c     \/\/ \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b     connect( Machine (),&FWStateMachine:: finished,              this,      &QThread::        quit,              Qt::ConnectionType(Qt::AutoConnection | Qt::UniqueConnection));      \/\/ \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0433\u043d\u0430\u043b\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u043e     \/\/ \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b.     connect( this,      &QThread::        finished,              Machine (),&FWStateMachine:: stop,              Qt::ConnectionType(Qt::AutoConnection | Qt::UniqueConnection));      \/\/\/ @name \u041d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0438\u0437 @sa FWThread     \/\/\/ @{     connect (Machine (),&FWStateMachine:: started,              this,      &FWThread::       sign_MachineStarted,              Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));      connect (Machine (),&FWStateMachine:: stopped,              this,      &FWThread::       sign_MachineStopped,              Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));      connect (Machine (),&FWStateMachine:: sign_Paused,              this,      &FWThread::       sign_MachinePaused,              Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));      connect (Machine (),&FWStateMachine:: sign_Resumed,              this,      &FWThread::       sign_MachineResumed,              Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));     \/\/\/ @}      \/\/ \u043e\u0431\u044f\u0437\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u043b\u0435     \/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430     connect (Machine (),&FWStateMachine:: started,              this,      &FWThread::       slot_AfterMachineStart,              Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));   } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u043a\u043e\u0434\u0435 \u044f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u041f\u0440\u0438\u0432\u044b\u0447\u043a\u0430 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e: \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043a\u043b\u0430\u0441\u0441-\u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a <i>FWThread_helper<\/i> \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWThread<\/i> \u043f\u0430\u0440\u0443 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0412\u044b \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u0438\u0445, \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u044e\u0449\u0438\u0439\u0441\u044f <anchor>\u043b\u0438\u0441\u0442\u0438\u043d\u0433<\/anchor>.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">FWThread.h<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>\/\/\/ \/\/\/ \\language Russian \/\/\/  #ifndef FW_THREAD_H #define FW_THREAD_H  #include &lt;FWTypes&gt;  FW_BEGIN_NAMESPACE  \/\/------------------------------------------------------------------------------ \/**  * @brief \u0412\u043d\u0435\u0448\u043d\u044f\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f FW_THREAD_WAIT_TIMEOUT \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435  * \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u0430 @sa QThread::wait.  *  * @see QThread  *\/ extern unsigned long FW_THREAD_WAIT_TIMEOUT;  \/\/------------------------------------------------------------------------------ class FWThread_helper; class FWStateMachine;  \/\/------------------------------------------------------------------------------ class     #ifdef FW_LIBRARY         FW_SHARED_EXPORT     #else         Q_DECL_EXPORT     #endif FWThread : public QThread {     friend class FWThread_helper;      Q_OBJECT      Q_CLASSINFO(&quot;brief&quot;,          &quot;Framework Thread Class with QStateMashine&quot;)     Q_CLASSINFO(&quot;created&quot;,        &quot;03-JUN-2015&quot;)     Q_CLASSINFO(&quot;modified&quot;,       &quot;23-JUN-2015&quot;)     \/\/     Q_CLASSINFO(&quot;project&quot;,        &quot;Common Qt-based Framework&quot;)     \/\/     Q_CLASSINFO(&quot;info_ru&quot;,        &quot;http:\/\/doc.crossplatform.ru\/qt\/4.7.x\/qthread.html#&quot;)  \/\/    Q_DISABLE_COPY(FWThread)      \/\/\/ @name \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043a\u043b\u0430\u0441\u0441\u0430.     \/\/\/ @{     \/\/\/ \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438     typedef QThread BaseClass;     \/\/\/ @}    public:     enum FWThreadFlag     {       THF_Empty       = 0x00,       THF_Ready       = 0x01,       THF_Working     = 0x02,       THF_Paused      = 0x04,       THF_AutoDelete  = 0x08,       THF_Error       = 0x80,     };     Q_DECLARE_FLAGS(FWThreadFlags, FWThreadFlag)    private:      QPointer&lt;FWThread_helper&gt; m_helper;      \/\/\/     \/\/\/ @brief \u0410\u0442\u0440\u0438\u0431\u0443\u0442 m_flags \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u043b\u0430\u0433\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u043e\u0442\u043e\u043a\u0430.     \/\/\/ @see FWThreadFlags.     \/\/\/     QAtomicInt   m_flags;      \/\/\/ @name \u0417\u0430\u043a\u0440\u044b\u0442\u044b\u0435 (\u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435) \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u043b\u0430\u0433\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430     \/\/\/ @{      void     SetEmpty ()     {       m_flags.fetchAndStoreOrdered (THF_Empty);     }      void     SetReady ()     {       FWThreadFlags v_flags = Flags () | THF_Ready;       m_flags.fetchAndStoreOrdered (v_flags);     }      void UnsetReady ()     {       FWThreadFlags v_flags = Flags () & (~THF_Ready);       m_flags.fetchAndStoreOrdered (v_flags);     }      void     SetWorking ()     {       FWThreadFlags v_flags = Flags () | THF_Working;       m_flags.fetchAndStoreOrdered (v_flags);     }      void     SetStop ()     {       FWThreadFlags v_flags = Flags () & (~THF_Working);       m_flags.fetchAndStoreOrdered (v_flags);     }      void     SetPause ()     {       FWThreadFlags v_flags = Flags () | THF_Paused;       m_flags.fetchAndStoreOrdered (v_flags);     }      void     SetResume ()     {       FWThreadFlags v_flags = Flags () & (~THF_Paused);       m_flags.fetchAndStoreOrdered (v_flags);     }      void     SetAutoDelete ()     {       FWThreadFlags v_flags = Flags () | THF_AutoDelete;       m_flags.fetchAndStoreOrdered (v_flags);       Reconnect();     }      void     UnsetAutoDelete ()     {       FWThreadFlags v_flags = Flags () & (~THF_AutoDelete);       m_flags.fetchAndStoreOrdered (v_flags);     }      void     SetError ()     {       FWThreadFlags v_flags = Flags () | THF_Error;       m_flags.fetchAndStoreOrdered (v_flags);     }      void     UnsetError ()     {       FWThreadFlags v_flags = Flags () & (~THF_Error);       m_flags.fetchAndStoreOrdered (v_flags);     }      \/\/\/ @}      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 InternalRun \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439      * \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438.      *\/     void     InternalRun();    public:      \/**      * @static      * @brief \u041c\u0435\u0442\u043e\u0434 SetThreaWaitTimeout \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435      * \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u0430 @sa QThread::wait.      * @param aValue \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u0430 @sa QThread::wait.      *      * @see QThread      *\/     static void     SetThreaWaitTimeout( unsigned long aValue)     {       if(NOT_EQUAL(FW_THREAD_WAIT_TIMEOUT,aValue))         FW_THREAD_WAIT_TIMEOUT = aValue;     }      \/**      * @brief \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 @sa FWThread      * @param aAutoDelete \u041f\u0440\u0438\u0437\u043d\u0430\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e      * \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0442\u043e\u043a\u0430.      * @param aParent \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442-\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u043a\u043b\u0430\u0441\u0441\u0430.      *      * @note \u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c @sa aParent \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442-\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0435 \u043f\u0443\u0441\u0442,      * \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 @sa aAutoDelete \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0438 \u043f\u043e\u0442\u043e\u043a \u043d\u0435 \u0440\u0430\u0437\u0440\u0443\u0448\u0430\u0435\u0442\u0441\u044f      * \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.      *\/     explicit     FWThread(const bool aAutoDelete = true, QObject* aParent = Q_NULLPTR);      ~FWThread();      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 AsBaseClass \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 (\u043e\u044e\u044a\u0435\u043a\u0442)      * \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWThread \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 @sa QThread.      * @return \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0442\u0438\u043f\u0430 @sa QThread \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0434\u0430\u043f\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.      *\/     BaseClass*     AsBaseClass () { return qobject_cast&lt;BaseClass*&gt;(this); }      \/\/\/     \/\/\/ @brief \u041c\u0435\u0442\u043e\u0434 setParent \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 @sa QObject::setParent.     \/\/\/ @param aParent \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 &quot;\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f&quot;     \/\/\/ \u041c\u0435\u0442\u043e\u0434 \u0432\u0432\u0435\u0434\u0451\u043d \u0432 \u043a\u043b\u0430\u0441\u0441 \u0441 \u0446\u0435\u043b\u044c\u044e \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e     \/\/\/ \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0444\u043b\u0430\u0433\u0430 @sa aAutoDelete     \/\/\/ \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 TRUE.     \/\/\/ @see FWThread::FWThread     \/\/\/     virtual void     setParent(QObject* aParent);      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 Flags \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u043b\u0430\u0433\u043e\u0432 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 FWThread.      * @return \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u043b\u0430\u0433\u043e\u0432 \u043f\u043e\u0442\u043e\u043a\u0430 \u0442\u0438\u043f\u0430 @sa FWThread::FWThreadFlags      *\/     inline FWThreadFlags     Flags () const { return FWThreadFlags(m_flags.loadAcquire ()); }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 Machine \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u041a\u0410, \u0443\u043f\u0440\u043e\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439      * \u043f\u043e\u0442\u043e\u043a\u0430.      * @return \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u041a\u0410 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430.      *      * @warning \u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e      * \u043f\u043e\u0442\u043e\u043a\u0430, \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u043c \u0441 \u0430\u0434\u0440\u0435\u0441\u043d\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e      * \u043a\u043b\u0430\u0441\u0441\u0430.      *\/     FWStateMachine*     Machine ();      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 MachineExists \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0430 \u043d\u0430 \u041a\u0410.      * @return \u0411\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:      * @value TRUE \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u041a\u0410;      * @value FALSE \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u041a\u0410 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d.      *\/     inline bool     MachineExists () { return NOT_NULL(Machine ()); }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 IsValid \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e\u0431 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430      * \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445.      * @return \u0411\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:      * @value TRUE \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430;      * @value FALSE \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u043d\u0435\u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043a \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044e.      *\/     virtual bool     IsValid ();      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 IsReady \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443.      * @return \u0411\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:      * @value TRUE \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e\u0442\u043a\u0430 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443;      * @value FALSE \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u043d\u0435\u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443.      *\/     inline bool     IsReady () const { return Flags ().testFlag (THF_Ready); }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 IsAutoDeleted \u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043e\u0431 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438      * \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u043e\u0442\u043e\u043a\u0430.      * @return \u0411\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:      * @value TRUE \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438;      * @value FALSE \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.      *      * \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,      *  @&lt;code&gt;      *  void foo ()      *  {      *    FWTread* v_thread = new FWTread(true);      *    bool v_with_timeout = &lt;\u0443\u0441\u043b\u043e\u0432\u0438\u0435&gt;;      *    ...      *    thread.quit ();      *      *    if(v_with_timeout)      *    {      *      if(!thread.wait (FW_THREAD_WAIT_TIMEOUT) )      *      {      *      \/\/ \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,      *      \/\/  terminate ();      *      \/\/  wait(1000);,      *      *      \/\/  \u0425\u043e\u0442\u044f terminate() \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f, \u043d\u043e \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 \u0435\u0433\u043e      *      \/\/  \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u043a\u0430\u043a quit() ;)      *      ...      *      }      *    }      *    else      *      v_thread-&gt;Machine()-&gt;stop ();      *      \/\/\u041e\u0441\u0442\u0430\u043d\u043e\u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 FWTread::quit, FWTread::finished      *      \/\/\u0432\u044b\u0437\u043e\u0432\u0435\u0442 FWTread::deleteLater, \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u0435 v_thread, \u0438      *      \/\/\u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWThread_helper \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 FWTread::m_helper.      *  }      * @&lt;\/code&gt;      *\/     inline bool     IsAutoDeleted () const { return Flags ().testFlag (THF_AutoDelete); }      inline bool     IsError () const { return Flags ().testFlag (THF_Error); }      inline bool     IsWorking () const { return Flags ().testFlag (THF_Working); }      inline bool     IsPaused () const { return Flags ().testFlag (THF_Paused); }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 AttachObject \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e      * \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.      * @param aObject \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442.      * @return \u0411\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:      * @value TRUE \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0447\u0442\u043e \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0451\u043d \u0443\u0441\u043f\u0435\u0448\u043d\u043e;      * @value FALSE \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432\u044b\u0437\u0432\u0430\u043b\u043e \u043e\u0448\u0438\u0431\u043a\u0438.      *\/     bool     AttachObject (QObject* aObject);      \/\/\/ @name \u041f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u0430 @sa QThread     \/\/\/ @{      \/**      * @brief \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 @sa QThread::terminate.      * \u041f\u0435\u0440\u0435\u0434 \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u041a\u0410, \u0435\u0441\u043b\u0438 \u0442\u043e\u0442 \u0430\u043a\u0442\u0438\u0432\u0435\u043d.      *\/     void terminate();      \/**      * @brief \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 @sa QThread::quit.      * \u041f\u0435\u0440\u0435\u0434 \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u041a\u0410, \u0435\u0441\u043b\u0438 \u0442\u043e\u0442 \u0430\u043a\u0442\u0438\u0432\u0435\u043d.      *\/     void quit();      \/\/\/ @}    protected:      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 Reconnect \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e      * \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0438 \u043f\u043e\u0442\u043e\u043a\u0430.      *      * \u041f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u041a\u0410 \u043a \u0441\u043b\u043e\u0442\u0430\u043c \u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u041a\u0410      * \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u041a\u0410. \u0422\u0430\u043a\u0436\u0435 \u043f\u043e\u0440\u044f\u0434\u043e\u043a      * \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u041a\u0410 \u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u043e\u0442\u043e\u043a\u0430.      *\/     void     Reconnect ();      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 run \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 @sa QThread::run.      * \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 @sa m_helper \u0438 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443      * \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043c @sa InternalRun      *      * \u0414\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u0446\u0438\u043a\u043b\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043c\u0435\u0442\u043e\u0434\u043e\u043c @sa exec() \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434      * \u043f\u0435\u0440\u0435\u043d\u043c\u0435\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u041a\u0410 \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u0430.      * \u0412\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043a \u043e\u0442 \u041a\u0410 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u043a\u0430\u043a \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435, \u0442\u0430\u043a \u0436\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438      * \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u0430.      * \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0437\u0430\u043f\u0443\u0441\u043a \u0446\u0438\u043a\u043b\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043c\u0435\u0442\u043e\u0434\u043e\u043c @sa exec().      *      * \u041c\u0435\u0442\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043a\u0442 \u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0410\u0432\u0442\u043e\u043c\u0430\u0442 \u0438 \u0446\u0438\u043a\u043b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0430      * \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.      * \u041f\u0435\u0440\u0435\u0434 \u044d\u0442\u0438\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 @sa BeforeMachineStart.      *      * @note \u041f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435 \u043c\u0435\u0442\u043e\u0434 @sa BeforeMachineStart \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f      * \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u041a\u0410.      *      * @warning \u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b      * \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0430 @sa AttachObject.      *      * @see QThreadPrivate::start, QThread::start, QThread::exec, QThread::exit.      *\/     void     run() Q_DECL_OVERRIDE;    public:      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 BeforeMachineStart \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043e\u0431\u044b\u0435      * \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u041a\u0410 \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.      *      * \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u041a\u0410 \u0437\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432      * \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438.      * \u041f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442, \u0441\u043a\u0430\u0436\u0435\u043c, \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u041a\u0410 \u0432\u043d\u0435\u0441\u0442\u0438      * \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u041a\u0410 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c      * \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435.      *      * @note \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0443 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445      * \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u041a\u0410 \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u0431\u0430\u0437\u043e\u0432\u044b\u043c. \u0412 \u043a\u043b\u0430\u0441\u0441\u0435 @sa FWStateMachine      * \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u0430\u043a \u0433\u0440\u0443\u043f\u043f\u0430 \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445      * \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0432\u044b\u0437\u043e\u0432\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438      * \u043c\u0435\u0442\u043e\u0434\u043e\u0432 Machine ()-&gt;StateGroup (). \u0412 \u0441\u0430\u043c\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e      * \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430      * \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432. \u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0433\u0440\u0443\u043f\u043f\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u043e\u043c      * \u043c\u0435\u0442\u043e\u0434\u0430 Machine ()-&gt;StateIdle ().      *      * \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 @sa BeforeMachineStart \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 FWUsbScanner      * \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\/\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432:      * @&lt;code&gt;      *      * @&lt;code&gt;      *      * @see FWStateMachine, FWState      * @see QStateMachine, QState, QAbstractTransition      *\/     virtual void     BeforeMachineStart () {}      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 BeforeThreadDone \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043e\u0431\u044b\u0435      * \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0442\u043e\u043a\u0430.      *      * \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u0442\u0430\u043a\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0443 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043f\u043e\u0442\u043e\u043a\u0430      * \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0442\u043e\u0447\u0435\u043a \u0432\u044b\u0445\u043e\u0434\u0430.      *      * \u041c\u0435\u0442\u043e\u0434 @sa BeforeThreadDone() \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434.      *      * \u0414\u043b\u044f \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.      *      * @note \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c: \u0442\u0435\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0430\u0434\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c      * \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u043e\u0442\u043e\u043a\u0430, \u043d\u043e \u043d\u0435 \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430      * \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWThread!      *      * @note \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c: \u0442\u0435\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0430\u0434\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c      * \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u043e\u0442\u043e\u043a\u0430, \u043d\u043e \u043d\u0435 \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430      * \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWThread!      *      * \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d \u0434\u0430\u0436\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439      * \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 @sa FWThread::run.      *\/     virtual void     BeforeThreadDone() {}      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 AfterThreadDone \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043e\u0431\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f      * \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0442\u043e\u043a\u0430.      *      * \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u0442\u0430\u043a\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0443 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043f\u043e\u0442\u043e\u043a\u0430      * \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0442\u043e\u0447\u0435\u043a \u0432\u044b\u0445\u043e\u0434\u0430.      *      * \u041c\u0435\u0442\u043e\u0434 @sa AfterThreadDone, \u043a\u0430\u043a \u0438 \u043c\u0435\u0442\u043e\u0434 @sa BeforeThreadDone(), \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442      * \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434.      *      * \u0414\u043b\u044f \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.      *      * @note \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c: \u0442\u0435\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f, \u0432\u0441\u0451 \u0435\u0449\u0435,\u0432 \u0430\u0434\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c      * \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u043e\u0442\u043e\u043a\u0430, \u043d\u043e \u043d\u0435 \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430      * \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWThread!      *      * \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d \u0434\u0430\u0436\u0435 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439      * \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 @sa FWThread::run.      *\/     virtual void     AfterThreadDone() {}      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 ThreadDone \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435\u043c      * \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0442\u043e\u043a\u0430.      *      * \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u0431\u0435\u0437      * \u0443\u0447\u0430\u0441\u0442\u0438\u044f @sa IsBreak (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043f\u043e\u0442\u043e\u043a\u0430).      * \u041c\u0435\u0442\u043e\u0434 @sa IsBreak , \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0441\u0430\u043c.      *\/     void     ThreadDone ();    Q_SIGNALS:      \/**      * @brief \u0421\u0438\u0433\u043d\u0430\u043b sign_MachineChanged \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0435\u0442 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430      * \u041a\u0410 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0435\u0433\u043e \u0432 \u043f\u043e\u0442\u043e\u043a\u0435 \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f (\u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u044f).      * @param aPointer \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u041a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 (\u041a\u0410).      *\/     void     sign_MachineChanged(const FWStateMachine* aPointer);      \/**      * @brief \u0421\u0438\u0433\u043d\u0430\u043b sign_MachineStarted \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0435\u0442 \u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u041a\u0410 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.      * @note \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0435\u0439 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 @sa QStateMachine::started;      *\/     void     sign_MachineStarted();      \/**      * @brief \u0421\u0438\u0433\u043d\u0430\u043b sign_MachineStopped \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0435\u0442 \u043e \u0445\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u041a\u0410.      * @note \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u0435\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0435\u0439 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 @sa QStateMachine::finished;      *\/     void     sign_MachineStopped();      \/**      * @brief \u0421\u0438\u0433\u043d\u0430\u043b sign_MachinePaused \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0435\u0442 \u043e \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u041a\u0410.      *\/     void     sign_MachinePaused ();      \/**      * @brief \u0421\u0438\u0433\u043d\u0430\u043b sign_MachineResumed \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0435\u0442 \u043e \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u041a\u0410.      *\/     void     sign_MachineResumed ();      \/**      * @brief \u0421\u0438\u0433\u043d\u0430\u043b sign_ObjectAddress \u0440\u0435\u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u0438\u0433\u043d\u0430\u043b @sa FWItem::sign_ObjectAddress      * \u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0443 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.      * @param aMyAddress \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430)      *\/     void     sign_ObjectAddress (QObject* aMyAddress);    public Q_SLOTS:      \/**      * @brief \u0421\u043b\u043e\u0442 slot_AfterMachineStart \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f      * \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u041a\u0410 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.      *      * \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u043c \u0441\u043b\u043e\u0442\u043e\u043c, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043b\u0438\u0448\u044c \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0446\u0438\u043a\u043b\u0430      * \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043c @sa QThread::exec. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u0435\u0442\u043e\u0434      * @sa FWStateMachine::start \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0442 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0434\u043e      * \u0432\u044b\u0437\u043e\u0432\u0430 @sa QThread::exec.      *      * \u041f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0439 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043c\u0435\u0442\u043e\u0434 QThread::run \u0441\u043f\u0435\u0440\u0432\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434      * @sa FWStateMachine::start, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438  @sa QThread::exec.      *      * @note \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c: \u0442\u0435\u043b\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0430\u0434\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c      * \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u043e\u0442\u043e\u043a\u0430, \u043d\u043e \u043d\u0435 \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430      * \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWThread!      *\/     virtual void     slot_AfterMachineStart () { if(!IsError ()) SetWorking (); }      \/**      * @brief \u0421\u043b\u043e\u0442 slot_Pause \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435      * \u0441\u043b\u043e\u0442 @sa FWStateMachine::slot_Pause.      *\/     void     slot_Pause ();      \/**      * @brief \u0421\u043b\u043e\u0442 slot_Resume  \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435      * \u0441\u043b\u043e\u0442 @sa FWStateMachine::slot_Resume      *\/     void     slot_Resume (); };  \/\/------------------------------------------------------------------------------  FW_END_NAMESPACE  Q_DECLARE_OPERATORS_FOR_FLAGS(FW_NAMESPACE::FWThread::FWThreadFlags)  #endif \/\/ FW_THREAD_H <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">FWThread.cpp<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>#include &quot;FWThread.h&quot; #include &quot;FWStateMachine.h&quot; #include &lt;FWItem&gt; #include &lt;QException&gt;  FW_BEGIN_NAMESPACE  \/\/------------------------------------------------------------------------------ unsigned long FW_THREAD_WAIT_TIMEOUT  = 7000;  \/\/------------------------------------------------------------------------------ \/**  * @brief \u041a\u043b\u0430\u0441\u0441 FWThread_helper \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e  * \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u043c\u0443 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 @sa FQThread.  *  * \u041e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430  * \u043a\u043b\u0430\u0441\u0441\u0430 @sa FQThread. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 @sa Qthread::run :  * @&lt;code&gt;  * FWThread::run()  * {  *    QScopedPointer&lt;FWThread_helper&gt; v_helper(new FWThread_helper(this));  *  * }  * @&lt;\/code&gt;  *  * &quot;\u0423\u043c\u043d\u044b\u0439&quot; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c v_helper \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWThread_helper \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442  * \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u0430\u0436\u0435 \u043f\u0440\u0438  * \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.  *  * \u041a\u043b\u0430\u0441\u0441 \u043e\u043f\u043e\u0437\u043d\u0430\u0451\u0442 \u043f\u043e\u0442\u043e\u043a-\u0445\u043e\u0437\u044f\u0438\u043d \u0442\u0438\u043f\u0430 @sa FWThread \u043f\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430  * @sa m_ext_thread.  *  * \u0412 \u043a\u043b\u0430\u0441\u0441\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0430\u0442\u0440\u0438\u0431\u0443\u0442 @sa m_fsm, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439  * \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0442\u0438\u043f\u0430 @sa FWStateMachine \u043a\u0430\u043a \u043f\u043e\u0442\u043e\u043c\u043e\u043a \u043a\u043b\u0430\u0441\u0441\u0430 @sa QStateMachine.  *  * \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 @sa ~FWThread_helper \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0451\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432  * \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0438 \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430  * @sa FWThread_helper::m_objects_container.  *  * @warning \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c @sa FWThread_helper::m_ext_thread  * \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWThread \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u044b\u043c. \u0420\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430-\u043f\u043e\u0442\u043e\u043a\u0430  * \u0432 \u0434\u0430\u043d\u043d\u043e\u043b\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u041f\u043e\u0442\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.  *\/ class   #ifdef FW_LIBRARY       FW_SHARED_EXPORT   #else       Q_DECL_EXPORT   #endif FWThread_helper : public QObject { \/\/    Q_OBJECT      \/**      * @brief \u0422\u0438\u043f TSharedObject \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 @sa QObject      * \u043a\u0430\u043a \u043e\u0431\u0449\u0438\u0439 &quot;\u0443\u043c\u043d\u044b\u0439&quot; \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c.      *      * @see QSharedPointer, QObject      *\/     typedef QSharedPointer&lt;QObject&gt; TSharedObject;      \/**      * @brief \u0422\u0438\u043f TObjectsList \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445      * \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 @sa m_ext_thread.      *      * @value TObjectsList::at(&lt;i&gt;) \u043e\u0431\u0432\u0451\u0440\u043d\u0443\u0442\u044b\u0439 \u0442\u0438\u043f\u043e\u043c @sa TSharedObject \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c      * \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 @sa m_ext_thread.      *\/     typedef QList&lt;TSharedObject&gt;  TObjectsList;    private:     \/**      * @brief \u0410\u0442\u0440\u0438\u0431\u0443\u0442 m_ext_thread \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 @sa FWThread.      *\/     QPointer&lt;FWThread&gt; m_ext_thread;      \/**      * @brief \u0410\u0442\u0440\u0438\u0431\u0443\u0442 m_fsm \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442,      * \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430      * @sa m_ext_thread.      *\/     QPointer&lt;FWStateMachine&gt;  m_fsm;      \/**      * @brief \u0410\u0442\u0440\u0438\u0431\u0443\u0442 m_objects_container \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0442\u0438\u043f\u0430      * @sa TSharedObject \u043d\u0430 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430      * @sa m_ext_thread.      *      * @note \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u044b \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043ee \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430      * @sa FWThread \u043f\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 @sa m_ext_thread.      *\/     TObjectsList  m_objects_container;      \/**      * @static      * @brief \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 OnDeleteLater \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0434\u043b\u044f      * \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 @sa m_objects_container, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e      * \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 @sa m_ext_thread.      * @param aObject \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442.      *\/     static     void OnDeleteLater(QObject* aObject)     {       if(NOT_NULL(aObject))         aObject-&gt;deleteLater();     }    public:      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 ClearObjects \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445      * \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 @sa m_ext_thread.      *\/     void     ClearObjects ()     {       Q_FOREACH(TSharedObject v_obj, m_objects_container)           v_obj.reset();       m_objects_container.clear ();     }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 LocateObject \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.      * @param aObject \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.      * @return \u0411\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:      * @value TRUE \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435;      * @value FALSE \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435.      *\/     bool     LocateObject (const QObject* aObject) const     {       Q_FOREACH(TSharedObject v_obj, m_objects_container)           if(EQUAL(v_obj.data (),aObject))             return true;       return false;     }      \/**      * @brief \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 FWThread_helper \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWThread_helper.      * @param aThread \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u043c @sa FWThread_helper      * \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWThread.      *      * @warning \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 @sa aThread \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c NULL, \u0442.\u043a. \u0442\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u0435\u0441\u044c      * \u0441\u043c\u044b\u0441\u043b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.      *\/     explicit     FWThread_helper(FWThread* aThread)       : QObject     (Q_NULLPTR)       , m_ext_thread(aThread)       , m_fsm       (new FWStateMachine)     {       Q_ASSERT(NOT_NULL(m_ext_thread));       m_objects_container.clear ();     }      \/**      * @brief \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWThread_helper.      *      * \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430 @sa FWThread::run.      * \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445      * \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 @sa m_ext_thread.      *      * \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWThread \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e      * \u0442\u043e\u0447\u043a\u043e\u0439 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u0430 (\u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435, \u0432\u044b\u0445\u043e\u0434 \u043f\u0440\u0438      * \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438)      *\/     ~FWThread_helper()     {       if(NOT_NULL(m_ext_thread))       {         m_ext_thread-&gt;BeforeThreadDone ();         m_ext_thread-&gt;ThreadDone ();         m_ext_thread-&gt;AfterThreadDone ();       }       ClearObjects ();       m_fsm-&gt;deleteLater ();     }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 Machine \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439      * \u0430\u0432\u0442\u043e\u043c\u0430\u0442 (\u041a\u0410).      * @return \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430.      *      * \u041e\u0431\u044a\u0435\u043a\u0442 \u041a\u0410 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430, \u0430 \u043d\u0435      * \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWThread.      *\/     FWStateMachine*     Machine () const { return m_fsm; }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 InsertObject \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 @sa QObject \u043a \u043f\u043e\u0442\u043e\u043a\u0443      * \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.      * @param aObject \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442.      *      * \u0415\u0441\u043b\u0438 \u043a\u043b\u0430\u0441\u0441 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWItem \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u0442\u043e      * \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442.      *      * @note \u0414\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u0442\u0441\u044f \u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435      * \u0444\u043b\u0430\u0433\u0430 @sa FWItem::SF_Active \u043c\u0435\u0442\u043e\u0434\u043e\u043c @sa FWItem::IsActive, \u0447\u0442\u043e\u0431\u044b      * \u0432\u044b\u0439\u0442\u0438 \u0438\u0437 \u043d\u0435\u0451 \u0432 \u043a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u043c\u043e\u043c\u0435\u043d\u0442. C\u043b\u043e\u0442 @sa FWItem::slot_BreakProcess      * \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d \u043a \u0441\u0438\u0433\u043d\u0430\u043b\u0443 @sa FWStateMachine::finished, \u0447\u0442\u043e \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c      * \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0444\u043b\u0430\u0433\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 @sa FWItem::SF_Active \u0432 \u043d\u0435\u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435      * \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043e\u0451\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 @sa FWThread::quit      * \u0438 @sa FWThread::terminate.      *\/     void     InsertObject (QObject* aObject)     {       if(NOT_NULL(aObject) && (!LocateObject(aObject)) )       {         aObject-&gt;setParent (Q_NULLPTR);         aObject-&gt;moveToThread (m_ext_thread);          if( aObject-&gt;inherits (FW_CLASS_STR(FWItem).toLatin1 ()) )         {           \/\/ \u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0430\u0434\u0440\u0435\u0441\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u0430           QObject::connect (qobject_cast&lt;FWItem*&gt;(aObject),                             &FWItem::   sign_ObjectAddress,                             m_ext_thread,                             &FWThread:: sign_ObjectAddress,                             Qt::ConnectionType(Qt::DirectConnection |                                                Qt::UniqueConnection));         }          m_objects_container.append (TSharedObject(aObject,OnDeleteLater));       }     } };  \/\/------------------------------------------------------------------------------ FWThread::FWThread(const bool aAutoDelete, QObject* aParent)   : BaseClass (aParent)   , m_helper  (Q_NULLPTR) {   SetEmpty ();   if(aAutoDelete && IS_NULL(aParent))     SetAutoDelete (); }  \/\/------------------------------------------------------------------------------ FWThread::~FWThread() {   quit ();   if(!wait (FW_THREAD_WAIT_TIMEOUT))   {     \/\/ \u043d\u0443, \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439...     terminate ();     if(!wait(FW_THREAD_WAIT_TIMEOUT))       exit(EXIT_FAILURE);   } }  \/\/------------------------------------------------------------------------------ void FWThread::setParent(QObject* aParent) {   BaseClass::setParent (aParent);    bool is_autodelete = bool(Flags () | THF_AutoDelete);   if(IS_NULL(aParent) && (!is_autodelete))     SetAutoDelete ();   else     if(NOT_NULL(aParent) && (is_autodelete))       UnsetAutoDelete ();    if(!IsAutoDeleted ())     disconnect( this, &QThread::finished, this, &QThread::deleteLater); }  \/\/------------------------------------------------------------------------------ FWStateMachine* FWThread::Machine() {   return m_helper.isNull () ? Q_NULLPTR : m_helper-&gt;Machine (); }  \/\/------------------------------------------------------------------------------ bool FWThread::IsValid() {   return       (!IsError()) &&       (MachineExists () ? Machine ()-&gt;IsValid () : false); }  \/\/------------------------------------------------------------------------------ bool FWThread::AttachObject(QObject* aObject) {   bool v_retval = !m_helper.isNull ();   if(v_retval)     m_helper-&gt;InsertObject (aObject);    return v_retval; }  \/\/------------------------------------------------------------------------------ void FWThread::terminate() {   ThreadDone ();   BaseClass::terminate (); }  \/\/------------------------------------------------------------------------------ void FWThread::quit() {   ThreadDone ();   BaseClass::quit (); }  \/\/------------------------------------------------------------------------------ void FWThread::Reconnect() {   if(IsAutoDeleted ())     \/\/ \u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b     connect( this, &QThread::finished,              this, &QThread::deleteLater,              Qt::ConnectionType(Qt::QueuedConnection | Qt::UniqueConnection));    if(MachineExists ())   {     \/\/ \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0446\u0438\u043a\u043b\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c     \/\/ \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b     connect( Machine (),&FWStateMachine:: finished,              this,      &QThread::        quit,              Qt::ConnectionType(Qt::AutoConnection | Qt::UniqueConnection));      \/\/ \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0433\u043d\u0430\u043b\u0430 \u043f\u043e\u0442\u043e\u043a\u0430 \u043e     \/\/ \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b.     connect( this,      &QThread::        finished,              Machine (),&FWStateMachine:: stop,              Qt::ConnectionType(Qt::AutoConnection | Qt::UniqueConnection));      \/\/\/ @name \u041d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f \u0440\u0435\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0438\u0437 @sa FWThread     \/\/\/ @{     connect (Machine (),&FWStateMachine:: started,              this,      &FWThread::       sign_MachineStarted,              Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));      connect (Machine (),&FWStateMachine:: stopped,              this,      &FWThread::       sign_MachineStopped,              Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));      connect (Machine (),&FWStateMachine:: sign_Paused,              this,      &FWThread::       sign_MachinePaused,              Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));      connect (Machine (),&FWStateMachine:: sign_Resumed,              this,      &FWThread::       sign_MachineResumed,              Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));     \/\/\/ @}      \/\/ \u043e\u0431\u044f\u0437\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0442\u043e\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u043f\u043e\u0441\u043b\u0435     \/\/ \u0437\u0430\u043f\u0443\u0441\u043a\u0430 r\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430     connect (Machine (),&FWStateMachine:: started,              this,      &FWThread::       slot_AfterMachineStart,              Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));   } }  \/\/------------------------------------------------------------------------------ void FWThread::InternalRun() {   QException _e;    QT_TRY   {     if(IsValid ())     {       \/\/\/ \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430       Reconnect ();        SetReady ();        emit sign_MachineChanged(Machine ());     }     else       _e.raise ();   }   QT_CATCH(QException &e)   {     UnsetAutoDelete ();     SetError ();     qDebug() &lt;&lt; qPrintable(e.what ());   } }  \/\/------------------------------------------------------------------------------ void FWThread::run() {   FWThread_helper* v_helper = new FWThread_helper(this);   m_helper = v_helper;    InternalRun ();    if(IsValid ())   {     BeforeMachineStart ();      \/\/\/ \u0417\u0430\u043f\u0443\u0441\u043a \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u041a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0430 @sa Machine ().     Machine ()-&gt;start ();      \/\/\/ \u0417\u0430\u043f\u0443\u0441\u043a \u0446\u0438\u043a\u043ba \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043e\u0442\u043e\u043a\u0430. =&gt; \u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u041a\u0410.     BaseClass::exec ();   }   else   {     if(!IsError ()) SetError ();     exit (FW_ERR_THREAD_INCOMPLETE);   }    m_helper.clear (); }  \/\/------------------------------------------------------------------------------ void FWThread::ThreadDone() {   SetStop ();    if(MachineExists ())   {     if(Machine ()-&gt;IsActive ())       Machine ()-&gt;stop (); \/\/    QObject::disconnect (Machine ());   } }  \/\/------------------------------------------------------------------------------ void FWThread::slot_Pause() {   if(MachineExists())     Machine ()-&gt;slot_Pause(); }  \/\/------------------------------------------------------------------------------ void FWThread::slot_Resume() {   if(MachineExists())     Machine ()-&gt;slot_Resume(); }  \/\/------------------------------------------------------------------------------  FW_END_NAMESPACE <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u043e\u043a\u0430 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 FWThread ::BeforeMachineStart (). \u041f\u0440\u0438\u0447\u0442\u0438\u0442\u0435 \u043a\u043e\u043c\u043c\u0435\u0442\u0440\u0430\u0440\u0438\u0438 \u0441\u0442\u0438\u043b\u044f <i>doxygen<\/i> \u0432 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0435 \u0444\u0430\u0439\u043b\u0430 FWThread.h.<\/p>\n<p>  \u0412\u043e\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <i>FWThread::run()<\/i>! <br \/>  \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041a\u0410 \u0432 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 <i>FWStateMachine::BeforeMachineStart ()<\/i>, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435.<\/p>\n<p>  \u041a\u043b\u0430\u0441\u0441-\u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a <i>FWThread_helper<\/i> \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438 \u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438.<br \/>  \u0412 \u043d\u0451\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u043c\u0435\u0449\u0451\u043d \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\u044b\u0445 \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430.<br \/>  \u0420\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWThread_helper<\/i> \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430, \u0447\u0442\u043e, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0443 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438.<\/p>\n<h2>\u0428\u0430\u0433 4. \u0421\u043e\u0431\u044b\u0442\u0438\u044f.<\/h2>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e. \u041c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <a href=\"http:\/\/doc.qt.io\/qt-5\/qevent.html\">QEvent<\/a> Qt, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043a \u043d\u0435\u043c\u0443 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u00ab\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u00bb. \u0422\u0438\u043f\u044b \u0441\u0442\u0430\u0440\u0448\u0435 <i>QEvent::User<\/i> \u0434\u0430\u044e\u0442 \u043f\u043e\u043d\u044f\u0442\u044c \u041a\u0410, \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438 (\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c\u0438) \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b\u043e, \u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u2026\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u0441\u043e\u0431\u044b\u0442\u0438\u044f.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041b\u0438\u0441\u0442\u0438\u043d\u0433 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 FWEvent \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c \u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u0438 \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>#ifndef FW_EVENT_H #define FW_EVENT_H  #include &lt;FWConstants&gt;  FW_BEGIN_NAMESPACE  \/\/------------------------------------------------------------------------------ class FWStateMachine;  \/\/------------------------------------------------------------------------------ \/**  * @brief \u041a\u043b\u0430\u0441\u0441 FWEvent \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043f\u0440\u0438\u043d\u044f\u0442\u0443\u044e \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435  * \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430.  *  * \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c (\u0434\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u043e\u043c) \u0441\u043e\u0431\u044b\u0442\u0438\u0439  * \u0438\u043b\u0438 \u041a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u043c (\u0434\u0430\u043b\u0435\u0435 -- \u041a\u0410) \u0442\u0438\u043f\u0430 @sa FWStateMachine.  * \u041b\u044e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442-\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWItem \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e  * \u0444\u043e\u0440\u043c\u0430\u0442\u0430.  * \u041b\u044e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442-\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWStateMachine \u041a\u0410 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c  * \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430.  * \u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u041a\u0410-\u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043a\u0430\u043a  * \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435. \u041c\u0435\u0442\u043e\u0434 @sa FWEvent::IsSystem \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u0437\u043d\u0430\u043a.  *  * \u041e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWTransition \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043c\u0435\u0436\u0434\u0443  * \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u041a\u0410. \u041f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b @sa FWTransition::testEvent \u043e\u0442\u0441\u0435\u043a\u0430\u044e\u0442  * \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c @sa FWEvent::Machine \u041a\u0410.  *\/ class     #ifdef FW_LIBRARY         FW_SHARED_EXPORT     #else         Q_DECL_EXPORT     #endif FWEvent : public QEvent {     Q_GADGET     Q_ENUMS(FWEventType)    \/\/----------------------------------------------------------------------------   private:      \/**      * @brief \u0410\u0442\u0440\u0438\u0431\u0443\u0442 m_id \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430.      *\/     FWIdentificator m_id;      \/**      * @brief \u0410\u0442\u0440\u0438\u0431\u0443\u0442 m_params \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u0430      * \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u043e\u0439 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d), \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f.      *\/     QVariantList m_params;    \/\/----------------------------------------------------------------------------   public:      \/**      * @brief \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 FWEvent::FWEvents \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0442\u0438\u043f\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u043b\u044f      * \u0440\u0430\u0431\u043e\u0442\u044b \u041a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430.      *\/     enum FWEventType     {       ET_SYSTEM,  \/\/\/&lt; \u0442\u0438\u043f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f        \/\/\/ @name \u0421\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f @sa FWEvent \u0422\u0438\u043f\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439       \/\/\/ @{       ET_GLOBAL   = QEvent::User  + 1,  \/\/\/&lt; \u0442\u0438\u043f \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e (\u043d\u043e \u043d\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e) \u0441\u043e\u0431\u044b\u0442\u0438\u044f       ET_INTERNAL = ET_GLOBAL     + 1,  \/\/\/&lt; \u0442\u0438\u043f \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \/\/TODO: \u0422\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435... \/\/      ET_SIGNAL   = ET_INTERNAL + 1,  \/\/\/&lt; \u0442\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f &quot;\u0421\u0438\u0433\u043d\u0430\u043b&quot;       ET_TASK     = ET_INTERNAL   + 1,  \/\/\/&lt; \u0442\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438        \/\/\/ @}       ET_MAX      = ET_TASK       + 1,  \/\/\/&lt; \u0442\u0438\u043f \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0439 \u0432\u0435\u0440\u0445\u043d\u0435\u0439                                       \/\/\/&lt; \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0442\u0438\u043f\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439     };      \/\/--------------------------------------------------------------------------     \/\/\/ @name \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0438 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430.     \/\/\/ @{      \/**      * @brief \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 FWEvent \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.      * @param aEvent \u0422\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f;      * @param aID \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u044f. \u0414\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432      * \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 @sa EMPTY_ID.      * @param aParams \u041d\u0435\u043a\u0438\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.      *      * @note \u041f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0430 \u0431\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f      * \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c \u0442\u0438\u043f\u043e\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438      * \u043f\u0443\u0441\u0442\u044b\u043c\u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0435 \u043d\u0435\u0441\u0451\u0442      * \u0441\u043c\u044b\u0441\u043b\u043e\u0432\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.      *      * @see QEvent, QEvent::Type, FWIdentificator, QVariantList.      *\/     explicit     FWEvent(QEvent::Type        aEvent,             FWIdentificator     aID     = EMPTY_ID,             const QVariantList& aParams = QVariantList())       : QEvent(aEvent)       , m_id  (aID)     {       SetParams (aParams);     }      \/**      * @brief \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 FWEvent \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0430\u043d\u043d\u043e\u0433\u043e      * \u043a\u043b\u0430\u0441\u0441\u0430.      * @param aEvent \u0422\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 @sa FWEvent::FWEventType;      * @param aID \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u044f;      * @param aParams \u041d\u0435\u043a\u0438\u0439 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432.      *\/     explicit     FWEvent(FWEvent::FWEventType  aEvent,             FWIdentificator       aID,             const QVariantList&   aParams = QVariantList())       :FWEvent(static_cast&lt;QEvent::Type&gt;(aEvent), aID, aParams)     {}      \/**      * @brief \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 FWEvent \u0441 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f.      * @param aEvent C\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442-\u0441\u043e\u0431\u0444\u0442\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a.      *\/     explicit     FWEvent(const FWEvent& aEvent)       : FWEvent (aEvent.type (), aEvent.Identificator (), aEvent.Params ())     {}      \/\/\/ @}      \/\/--------------------------------------------------------------------------     \/**      * @brief \u041c\u0435\u0442\u043e\u0434 AsBaseClass \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e      * \u0442\u0438\u043f\u0430 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.      * @return \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u043a\u0430\u043a \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0442\u0438\u043f\u0430 QEvent.      *\/     QEvent*     AsBaseClass () { return static_cast&lt;QEvent*&gt;(this); }      static bool     IsValidType (QEvent::Type aType)     { return BETWEEN(int(aType),QEvent::None, ET_MAX); }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 IsValid \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0443 \u0442\u0438\u043f\u043e\u0432,      * \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u043c.      * @param aEvent \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435      * @return \u0411\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:      * @value TRUE \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430;      * @value FALSE \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0435\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u043c \u043a\u043b\u0430\u0441\u0441\u0430.      *\/     static bool     IsValid (QEvent* aEvent)     {       if(NOT_NULL(aEvent))         return IsValidType(aEvent-&gt;type());       return false;     }      \/**      * @static      * @brief \u041c\u0435\u0442\u043e\u0434 IsType \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u0442\u0438\u043f\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043a \u0442\u0438\u043f\u0443 \u0438\u0437      * \u043d\u0430\u0431\u043e\u0440\u0430 @sa FWEvent::FWEventType.      * @param aEvent \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435;      * @param aType \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.      * @return \u0411\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:      * @value TRUE \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043a \u0442\u0438\u043f\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438;      * @value FALSE \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043a \u0442\u0438\u043f\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438;      *\/     static bool     IsType (QEvent* aEvent, FWEvent::FWEventType aType)     {       bool v_retval = IsValid (aEvent);        if(v_retval)       {         v_retval =             BETWEEN (int(aEvent-&gt;type ()),QEvent::None,ET_GLOBAL) ||             EQUAL   (aType,ET_SYSTEM);          if(!v_retval)           v_retval =  EQUAL(static_cast&lt;FWEvent::FWEventType&gt;(aEvent-&gt;type ()),                            aType);       }        return v_retval;     }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 IsSystem \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043a \u043d\u0430\u0431\u043e\u0440\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445      * \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0431\u043e\u0440\u0435 @sa QEvent::Type \u0434\u043e QEvent::User)      * @param aEvent \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435.      * @return \u0411\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:      * @value TRUE \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435;      * @value FALSE \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435.      *\/     static bool     IsSystem (QEvent* aEvent)     { return IsType (aEvent, ET_SYSTEM); }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 IsGlobal \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043a \u043d\u0430\u0431\u043e\u0440\u0443 \u043e\u0431\u0449\u0438\u0445      * \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u043a\u0430\u043a @sa FWEventType::ET_GLOBAL      * @param aEvent \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435.      * @return \u0411\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:      * @value TRUE \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f;      * @value FALSE \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.      *\/     static bool     IsGlobal (QEvent* aEvent)     { return IsType (aEvent, ET_GLOBAL); }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 IsGlobal \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043a \u043d\u0430\u0431\u043e\u0440\u0443 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445      * \u0441\u043e\u0431\u044b\u0442\u0438\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u043a\u0430\u043a @sa FWEventType::ET_INTERNAL      * @param aEvent \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435.      * @return \u0411\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:      * @value TRUE \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0435;      * @value FALSE \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0435 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0435.      *\/     static bool     IsInternal (QEvent* aEvent)     { return IsType (aEvent, ET_INTERNAL); }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 IsGlobal \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043a \u043d\u0430\u0431\u043e\u0440\u0443      * \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u043a\u0430\u043a @sa FWEventType::ET_TASK      * @param aEvent \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435.      * @return \u0411\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435:      * @value TRUE \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u0438\u0437 \u043d\u0430\u0431\u0440\u0430 \u0437\u0430\u0434\u0430\u0447;      * @value FALSE \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043d\u0435 \u0438\u0437 \u043d\u0430\u0431\u0440\u0430 \u0437\u0430\u0434\u0430\u0447.      *\/     static bool     IsTask (QEvent* aEvent)     { return IsType (aEvent, ET_TASK); }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 Identificator \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u044f      * \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 @sa FWEvent::FWEventType      * @return \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f.      *\/     inline FWIdentificator     Identificator () const { return m_id; }      inline QVariantList     Params () const { return m_params; }      inline void     SetIdentificator (const FWIdentificator aID)     {       if(NOT_EQUAL(Identificator (), aID) )         m_id = aID;     }      inline void     SetParams (const QVariantList& aParams)     {       m_params.clear ();       m_params.append (aParams);     }      inline virtual bool     IsValid ()     { return IsValid (AsBaseClass ()) && NOT_EQUAL(Identificator (),EMPTY_ID); }      virtual FWEvent&     operator = (const FWEvent& aFrom)     {       AsBaseClass ()-&gt;operator = (aFrom);        SetIdentificator(aFrom.Identificator ());       SetParams       (aFrom.Params ());        return (*this);     }      inline virtual bool     operator == (const FWEvent& aFrom)     { return           EQUAL(type (),          aFrom.type ()         ) &&           EQUAL(Identificator (), aFrom.Identificator ());     }      inline virtual bool     operator == (const QEvent& aFrom)     { return EQUAL(type (), aFrom.type ());  }      inline virtual bool     operator != (const FWEvent& aFrom) { return NOT_EQUAL(*this, aFrom); }      inline virtual bool     operator != (const QEvent& aFrom) { return NOT_EQUAL(*this, aFrom); } };  \/\/------------------------------------------------------------------------------ \/\/------------------------------------------------------------------------------ class     #ifdef FW_LIBRARY         FW_SHARED_EXPORT     #else         Q_DECL_EXPORT     #endif FWSystemEvent : public FWEvent {     Q_GADGET   public:     explicit     FWSystemEvent(FWIdentificator     aID,                   const QVariantList& aParams = QVariantList())       : FWEvent(FWEvent::ET_SYSTEM, aID, aParams)     { Q_ASSERT(IsSystem (AsBaseClass ())); } };  \/\/------------------------------------------------------------------------------ \/\/------------------------------------------------------------------------------ class     #ifdef FW_LIBRARY         FW_SHARED_EXPORT     #else         Q_DECL_EXPORT     #endif FWGlobalEvent : public FWEvent {     Q_GADGET   public:     explicit     FWGlobalEvent(FWIdentificator     aID,                   const QVariantList& aParams = QVariantList())       : FWEvent(FWEventType::ET_GLOBAL, aID, aParams) {} };  \/\/------------------------------------------------------------------------------ \/\/------------------------------------------------------------------------------ class     #ifdef FW_LIBRARY         FW_SHARED_EXPORT     #else         Q_DECL_EXPORT     #endif FWInternalEvent : public FWEvent {     Q_GADGET     Q_ENUMS(FWInternalIdentificators)    public:      enum FWInternalIdentificators     {       OEI_None  = FWIdentificator(0x00),       OEI_Start = FWIdentificator(0x01),       OEI_Stop  = FWIdentificator(0x02),       OEI_Pause = FWIdentificator(0x04),       OEI_Resume= FWIdentificator(0x08),       OEI_Log   = FWIdentificator(0x10),       OEI_Error = FWIdentificator(0x20),     };      explicit     FWInternalEvent(FWIdentificator     aID     = OEI_None,                     const QVariantList& aParams = QVariantList())       : FWEvent(FWEventType::ET_INTERNAL, aID, aParams)     {}      bool     IsValid () Q_DECL_OVERRIDE     { return FWEvent::IsValid () && NOT_EQUAL(Identificator (),OEI_None); } };  \/\/------------------------------------------------------------------------------ \/\/------------------------------------------------------------------------------ class     #ifdef FW_LIBRARY         FW_SHARED_EXPORT     #else         Q_DECL_EXPORT     #endif FWTaskEvent : public FWEvent {     Q_GADGET   public:     enum FWUsbTask     {       TEI_None      = FWIdentificator(0),       TEI_Open,       TEI_Opened,       TEI_Close,       TEI_Closed,       TEI_NewStatus,       TEI_NewFileName,       TEI_Write,       TEI_Writed,       TEI_Read,       TEI_Readed,       TEI_Log,       TEI_Error,     };      explicit     FWTaskEvent(FWIdentificator     aID     = EMPTY_ID,                 const QVariantList& aParams = QVariantList())       : FWEvent(FWEventType::ET_TASK, aID, aParams)     {}      bool     IsValid () Q_DECL_OVERRIDE     { return FWEvent::IsValid () && NOT_EQUAL(Identificator (),EMPTY_ID); } };  \/\/------------------------------------------------------------------------------ \/\/------------------------------------------------------------------------------ class     #ifdef FW_LIBRARY         FW_SHARED_EXPORT     #else         Q_DECL_EXPORT     #endif FWUsbEvent : public FWTaskEvent {     Q_GADGET    private:     quint16 m_VID;     quint16 m_PID;     quint8  m_BusNumber;     quint8  m_Address;     quint8  m_Port;    public:      enum FWUsbTask     {       UEI_None      = FWIdentificator(0),       UEI_Attached,       UEI_Detached,       UEI_ContextChanged,       UEI_Open,       UEI_Opened,       UEI_Close,       UEI_Closed,       UEI_WriteBulk,       UEI_WriteBulkComplete,       UEI_ReadBulk,       UEI_ReadBulkComplete,       UEI_Log,       UEI_Warning,       UEI_Error,     };      explicit     FWUsbEvent(quint16              aVendorID,                quint16              aProductID,                quint8               aBusNumber,                quint8               aAddress,                quint8               aPort,                FWIdentificator      aID     = FWUsbEvent::UEI_None,                const QVariantList&  aParams = QVariantList())       : FWTaskEvent (FWIdentificator(aID), aParams)       , m_VID       (aVendorID)       , m_PID       (aProductID)       , m_BusNumber (aBusNumber)       , m_Address   (aAddress)       , m_Port      (aPort)     {}      explicit     FWUsbEvent(FWIdentificator      aID,                const QVariantList&  aParams = QVariantList())       : FWUsbEvent(0,0,0,0,0,aID,aParams)     {}      inline quint16  VID       () const { return m_VID; }     inline quint16  PID       () const { return m_PID; }     inline quint8   BusNumner () const { return m_BusNumber; }     inline quint8   Address   () const { return m_Address; }     inline quint8   Port      () const { return m_Port; }      FWUsbEvent&     operator = (const FWUsbEvent& aFrom)     {       FWEvent::operator = (static_cast&lt;FWEvent&gt;(aFrom));       m_VID       = aFrom.VID ();       m_PID       = aFrom.PID ();       m_BusNumber = aFrom.BusNumner ();       m_Address   = aFrom.Address ();       m_Port      = aFrom.Port ();       return (*this);     }      bool     operator == (const FWUsbEvent& aFrom)     { return           FWEvent::operator == (static_cast&lt;FWEvent&gt;(aFrom)) &&           EQUAL(VID (), aFrom.VID ()) &&           EQUAL(PID (), aFrom.PID ()) &&           EQUAL(BusNumner (), aFrom.BusNumner ()) &&           EQUAL(Address (), aFrom.Address ()) &&           EQUAL(Port (), aFrom.Port ());     } };  \/\/------------------------------------------------------------------------------ \/\/------------------------------------------------------------------------------ \/\/\/ \/\/\/ @brief FWEventTypeMap \/\/\/ @see FWEvent, QEvent, QEvent::Type \/\/\/ typedef QMap&lt;FWEvent::FWEventType, FWEvent*&gt; FWEventTypeMap;  typedef QMapIterator&lt;FWEvent::FWEventType, FWEvent*&gt; FWEventTypeMap_I1; typedef FWEventTypeMap::Iterator FWEventTypeMap_I2; typedef FWEventTypeMap::ConstIterator FWEventTypeMap_CI;  \/\/\/ \/\/\/ @brief FWEventMap \/\/\/ @see FWEvent, QEvent, QEvent::Type, FWIdentificator \/\/\/ typedef QMap&lt;FWIdentificator, FWEvent*&gt; FWEventMap;  typedef QMapIterator&lt;FWIdentificator, FWEvent*&gt; FWEventMap_I1; typedef FWEventMap::Iterator FWEventMap_I2; typedef FWEventMap::ConstIterator FWEventMap_CI; \/\/------------------------------------------------------------------------------  FW_END_NAMESPACE  \/\/------------------------------------------------------------------------------ Q_DECLARE_METATYPE(FW_NAMESPACE::FWEventTypeMap) Q_DECLARE_METATYPE(FW_NAMESPACE::FWEventMap) \/\/------------------------------------------------------------------------------  #endif \/\/ FW_EVENT_H <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0430\u043a, \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0432 \u0442\u0435\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWStateMashine<\/i>, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWInternalEvent<\/i>, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 (\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0435) \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043a\u043b\u0430\u0441\u0441 <i>FWTskEvent<\/i>.<\/p>\n<p>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u041a\u0410 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%CA%EB%E0%F1%F1%E8%F4%E8%EA%E0%F6%E8%FF_%E0%E1%F1%F2%F0%E0%EA%F2%ED%FB%F5_%E0%E2%F2%EE%EC%E0%F2%EE%E2#.D0.90.D0.B2.D1.82.D0.BE.D0.BC.D0.B0.D1.82_.D0.9C.D1.83.D1.80.D0.B0\">\u043c\u043e\u0434\u0435\u043b\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u041c\u0443\u0440\u0430<\/a>, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043d\u0438\u0433\u0438 \u0410. \u041d. \u0411\u043e\u0440\u043e\u0432\u0441\u043a\u043e\u0433\u043e <a href=\"http:\/\/www.ozon.ru\/context\/detail\/id\/7449666\/\">\u00abQt4.7+.\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 C++\u00bb<\/a> \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%CA%EB%E0%F1%F1%E8%F4%E8%EA%E0%F6%E8%FF_%E0%E1%F1%F2%F0%E0%EA%F2%ED%FB%F5_%E0%E2%F2%EE%EC%E0%F2%EE%E2#.D0.90.D0.B2.D1.82.D0.BE.D0.BC.D0.B0.D1.82_.D0.9C.D0.B8.D0.BB.D0.B8\">\u043c\u043e\u0434\u0435\u043b\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u041c\u0438\u043b\u0438<\/a>, \u0433\u0434\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u043d\u0430\u0442\u044c, \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u0440\u0438\u0448\u043b\u0438, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u0430\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043a\u0430\u043a\u043e\u0439 \u0437\u0430 \u043d\u0430\u0431\u043e\u0440 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435.<\/p>\n<p>  \u0412\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c <a href=\"http:\/\/doc.qt.io\/qt-5\/qabstracttransition.html#eventTest\">QAbstractTransition::eventTest(QEvent* aEvent)<\/a> \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043a\u043b\u0430\u0441\u0441\u0430, <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u0432 \u0435\u0433\u043e:<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>bool FWTransition::eventTest(QEvent* aEvent) {   bool v_retval = FWEvent::IsValid (aEvent);    if(v_retval)     v_retval = EQUAL(aEvent-&gt;type (),EventType ());    if(v_retval)   {       FWEvent* v_e = static_cast&lt;FWEvent*&gt;(aEvent);       v_retval =           EQUAL(v_e-&gt;type (),         EventType ()) &&           EQUAL(v_e-&gt;Identificator (),EventID   ());   }    return v_retval; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041c\u0435\u0442\u043e\u0434 \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u0442 \u0432\u0441\u0435 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043b\u0438\u0448\u044c \u043f\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430, \u043d\u0433\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWTransition<\/i> \u041a\u0410.<\/p>\n<h3>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u0442\u043e\u0433.<\/h3>\n<p>  <\/p>\n<ul>\n<li>\u0421\u043e\u0437\u0434\u0430\u043d \u043a\u043b\u0430\u0441\u0441 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 QThread, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430.<\/li>\n<li>\u041a\u043b\u0430\u0441\u0441 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u0435\u043d \u043a \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432 \u0432 \u0435\u0434\u0438\u043d\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0439 \u043f\u043e\u0442\u043e\u043a\u043e\u043c.<\/li>\n<li>\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 FWThread \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0439 \u043f\u0435\u0440\u0435\u0434 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u041a\u0410, \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439.<\/li>\n<li>\u0418\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u0446\u0438\u043a\u043b\u0430 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438 \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0434\u043b\u044f \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u0430.<\/li>\n<li>\u041a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u043c.<\/li>\n<\/ul>\n<h2>\u0428\u0430\u0433 5. \u041f\u0440\u0438\u043c\u0435\u0440. \u0421\u043a\u0430\u043d\u0435\u0440 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0445 USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 libUSB.<\/h2>\n<p>  \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u044f\u0437\u043a\u0438 \u00ab\u043f\u043e\u0442\u043e\u043a + \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u00bb. <br \/>  \u042f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u044d\u0442\u0443 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438. <br \/>  \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 API \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"http:\/\/libusb.info\/\">libUSBx<\/a>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0435\u0433\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u043d\u043e\u0432\u043e\u0435 \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430.<\/p>\n<p>  \u0425\u043e\u0447\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <i>libUSB<\/i> \u0442\u0438\u043f\u0430 <a href=\"http:\/\/libusb.sourceforge.net\/api-1.0\/contexts.html\">libusb_context <\/a>. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u0445 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0443\u0434\u0435\u043b\u0435\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f.<\/p>\n<p>  \u0412\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u0447 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u0430\u0445. \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0441\u0435\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e\u0441\u043b\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0435\u0441\u0441\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <i>libusb_init(NULL)<\/i> \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0435\u043a\u0446\u0438\u044f \u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430. \u041f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435, \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043c\u0435\u0436\u0434\u0443 \u0432\u0441\u0435\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u0437\u0430\u043c\u0435\u0434\u043b\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <i>libusb_init()<\/i> \u043f\u0435\u0440\u0435\u0434\u0430\u043d <i>NULL<\/i>, \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <i>libusb_init ()<\/i>, \u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0435\u0442.<br \/>  \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <i>libUSB<\/i> \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432. \u0412\u0441\u0435 \u00ab\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b\u00bb <i>libUSB<\/i>, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u0445 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u0448\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443: \u0444\u0443\u043d\u043a\u0446\u0438\u044f <i>libusb_open ()<\/i>, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u0430\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0441\u0441\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043e\u0442 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0442\u0435 \u0436\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<br \/>   \u0415\u0441\u043b\u0438 \u043e\u0434\u043d\u0430 \u0441\u0435\u0441\u0441\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 <i>libusb_exit ()<\/i>, \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b API <i>libUSB<\/i>, \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u0430\u043a\u0440\u043e\u044e\u0442 \u0441\u0432\u043e\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <i>libusb_exit ()<\/i>. <\/p>\n<p>  \u042f \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0430\u0434\u0440\u0435\u0441\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u043c <i>libusb_get_device_list()<\/i>.<br \/>  \u0418 \u0443\u0436, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u043d\u0438 \u0432 \u043a\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0442\u0438\u043f\u0430 <a href=\"http:\/\/libusb.sourceforge.net\/api-1.0\/group__dev.html#ga77eedd00d01eb7569b880e861a971c2b\">libusb_device<\/a> \u0438\u0437 \u0441\u0435\u0441\u0441\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043f\u043e\u0442\u043e\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.<br \/>  \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0430\u0442\u044c USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u044f\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439:  <\/p>\n<ol>\n<li>VID:<\/li>\n<li>PID;<\/li>\n<li>\u041d\u043e\u043c\u0435\u0440 \u0448\u0438\u043d\u044b;<\/li>\n<li>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430;<\/li>\n<li>\u041d\u043e\u043c\u0435\u0440 \u043f\u043e\u0440\u0442\u0430.<\/li>\n<\/ol>\n<p>  \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f VID \u0438 PID \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u043e\u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430 \u0442\u0438\u043f\u0430 <a href=\"http:\/\/libusb.sourceforge.net\/api-1.0\/structlibusb__device__descriptor.html\">libusb_device_descriptor<\/a>, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 <a href=\"http:\/\/libusb.sourceforge.net\/api-1.0\/group__dev.html#gaf2718609d50c8ded2704e4051b3d2925\">libusb_get_bus_number()<\/a>, <a href=\"http:\/\/libusb.sourceforge.net\/api-1.0\/group__dev.html#gab6d4e39ac483ebaeb108f2954715305d\">libusb_get_device_address()<\/a> \u0438 <a href=\"http:\/\/libusb.sourceforge.net\/api-1.0\/group__dev.html#ga14879a0ea7daccdcddb68852d86c00c4\">libusb_get_port_number()<\/a>.<br \/>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0442 <i>QEvent<\/i>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0443 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u0432\u0442\u043e\u0440 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u0434\u0430<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>class     #ifdef FW_LIBRARY         FW_SHARED_EXPORT     #else         Q_DECL_EXPORT     #endif FWUsbEvent : public FWTaskEvent {     Q_GADGET    private:     quint16 m_VID;     quint16 m_PID;     quint8  m_BusNumber;     quint8  m_Address;     quint8  m_Port;    public:      enum FWUsbTask     {       UEI_None      = FWIdentificator(0),       UEI_Attached,       UEI_Detached,       UEI_ContextChanged,       UEI_Open,       UEI_Opened,       UEI_Close,       UEI_Closed,       UEI_WriteBulk,       UEI_WriteBulkComplete,       UEI_ReadBulk,       UEI_ReadBulkComplete,       UEI_Log,       UEI_Warning,       UEI_Error,     };      explicit     FWUsbEvent(quint16              aVendorID,                quint16              aProductID,                quint8               aBusNumber,                quint8               aAddress,                quint8               aPort,                FWIdentificator      aID     = FWUsbEvent::UEI_None,                const QVariantList&  aParams = QVariantList())       : FWTaskEvent (FWIdentificator(aID), aParams)       , m_VID       (aVendorID)       , m_PID       (aProductID)       , m_BusNumber (aBusNumber)       , m_Address   (aAddress)       , m_Port      (aPort)     {}      explicit     FWUsbEvent(FWIdentificator      aID,                const QVariantList&  aParams = QVariantList())       : FWUsbEvent(0,0,0,0,0,aID,aParams)     {}      inline quint16  VID       () const { return m_VID; }     inline quint16  PID       () const { return m_PID; }     inline quint8   BusNumner () const { return m_BusNumber; }     inline quint8   Address   () const { return m_Address; }     inline quint8   Port      () const { return m_Port; }      FWUsbEvent&     operator = (const FWUsbEvent& aFrom)     {       FWEvent::operator = (static_cast&lt;FWEvent&gt;(aFrom));       m_VID       = aFrom.VID ();       m_PID       = aFrom.PID ();       m_BusNumber = aFrom.BusNumner ();       m_Address   = aFrom.Address ();       m_Port      = aFrom.Port ();       return (*this);     }      bool     operator == (const FWUsbEvent& aFrom)     { return           FWEvent::operator == (static_cast&lt;FWEvent&gt;(aFrom)) &&           EQUAL(VID (), aFrom.VID ()) &&           EQUAL(PID (), aFrom.PID ()) &&           EQUAL(BusNumner (), aFrom.BusNumner ()) &&           EQUAL(Address (), aFrom.Address ()) &&           EQUAL(Port (), aFrom.Port ());     } }; <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u043b\u044f \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 FWUscbInstance \u0438 \u0435\u0433\u043e \u043f\u0440\u0435\u0434\u043e\u043a FWExecuteInstance. \u041a\u043b\u0430\u0441\u0441 FWExecuteInstance \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 FWDocument &lt; \u2014 FWItem.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">FWExecuteInstance.h<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>#ifndef FW_EXECUTE_INSTANCE_H #define FW_EXECUTE_INSTANCE_H  #include &lt;FWDocument&gt;  FW_BEGIN_NAMESPACE  \/\/------------------------------------------------------------------------------ class     #ifdef FW_LIBRARY         FW_SHARED_EXPORT     #else         Q_DECL_EXPORT     #endif FWExecuteInstance : public FWDocument {     Q_OBJECT      Q_CLASSINFO(&quot;brief&quot;,          &quot;FW Execute Instance Class&quot;)     Q_CLASSINFO(&quot;created&quot;,        &quot;12-MAY-2015&quot;)     Q_CLASSINFO(&quot;modified&quot;,       &quot;12-MAY-2015&quot;)     \/\/     Q_CLASSINFO(&quot;project&quot;,        &quot;Common Qt-based Framework&quot;)      \/\/\/ @name \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043a\u043b\u0430\u0441\u0441\u0430.     \/\/\/ @{      typedef FWDocument BaseClass;      \/\/\/ @}    private:     \/\/\/     \/\/\/ @brief m_timer     \/\/\/     QTimer m_timer;      \/\/\/     \/\/\/ @brief m_timer_mode     \/\/\/     bool m_timer_mode;    public:     Q_INVOKABLE explicit     FWExecuteInstance(bool      aTimerMode = false,                       QObject*  aParent    = Q_NULLPTR);      bool     IsTimerMode() const { return m_timer_mode; }      void     Open () Q_DECL_OVERRIDE;      void     Close () Q_DECL_OVERRIDE;      inline void     StartTimer (int aMSec = 10)     {       if((!m_timer.isActive ()) && IsTimerMode ())         m_timer.start (aMSec);     }      inline void     StopTimer ()     {     if(m_timer.isActive ())       m_timer.stop ();     }      inline bool     IsTiming () const     { return m_timer.isActive () && IsTimerMode (); }      void     SetTimerMode (bool aTimerMode)     {       if(EQUAL(m_timer_mode, aTimerMode))         return;        bool is_timing = IsTiming ();       if(is_timing)         StopTimer ();       m_timer_mode = aTimerMode;       if(is_timing || IsTimerMode ())         StartTimer ();     }    public slots:      virtual void     slot_OnExecute () {}      void     slot_BreakProcess () Q_DECL_OVERRIDE;      virtual void     slot_ResumeProcess ()     {       Open ();\/\/SetStatus (SF_Active);       if(IsTimerMode ())         StartTimer ();     } }; \/\/------------------------------------------------------------------------------  FW_END_NAMESPACE  #endif \/\/ FW_EXECUTE_INSTANCE_H <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">FWUscbInstance.h<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>#ifndef FW_USB_INSTANCE_H #define FW_USB_INSTANCE_H  #include &quot;FWUsbTypes.h&quot; #include &quot;FWExecuteInstance.h&quot;  FW_BEGIN_NAMESPACE  \/\/------------------------------------------------------------------------------ class FWUsbInstance; class FWUsbConnection;  \/\/------------------------------------------------------------------------------ \/\/\/ \/\/\/ \\language Russian \/\/\/ @brief \u041a\u043b\u0430\u0441\u0441 FWUsbInstance \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \/\/\/ \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 libusb \/\/\/ \/\/\/ \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u0438\u0431\u043b\u0448\u0438\u043e\u0442\u0435\u043a\u043e\u0439 libusb \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u0438\u0435 libusb \u0441\u0435\u0441\u0441\u0438\u0438. \/\/\/ \u041f\u043e\u043d\u044f\u0442\u0438\u0435 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u043e\u0439 libusb \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \/\/\/ \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 libusb (\u0438\u043b\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439) \/\/\/ \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \/\/\/ libusb - \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, libusb_set_debug () \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \/\/\/ \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0438 libusb_exit () \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \/\/\/ \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442. \/\/\/ \/\/\/ \u0421\u0435\u0441\u0441\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f libusb_init () \u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u043b \u0447\u0435\u0440\u0435\u0437 libusb_exit (). \/\/\/ class     #ifdef FW_LIBRARY         FW_SHARED_EXPORT     #else         Q_DECL_EXPORT     #endif FWUsbInstance : public FWExecuteInstance {     Q_OBJECT      Q_CLASSINFO(&quot;brief&quot;,          &quot;FW LibUSB Instance Class&quot;)     Q_CLASSINFO(&quot;created&quot;,        &quot;27-MAR-2015&quot;)     Q_CLASSINFO(&quot;modified&quot;,       &quot;12-MAY-2015&quot;)     \/\/     Q_CLASSINFO(&quot;project&quot;,        &quot;Common Qt-based Framework&quot;)      \/\/\/ @name \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043a\u043b\u0430\u0441\u0441\u0430.     \/\/\/ @{      typedef FWExecuteInstance BaseClass;      \/\/\/ @}    private:     \/\/\/ @name \u0421\u0435\u0440\u0432\u0438\u0441\u043d\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f     \/\/\/ @{     \/\/\/      \/\/\/ @brief m_context \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a libusb     \/\/\/ @see libusb_context, TUsbContext*     \/\/\/     TUsbContext*  m_context;      \/\/\/     \/\/\/ @brief m_log_level \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438     \/\/\/ @see libusb_log_level\u0431 TUsbLogLevel     \/\/\/     TUsbLogLevel    m_log_level;      QList&lt;QVector&lt;int&gt; &gt; m_attached_list;     \/\/\/ @}    public:      \/\/\/ @name \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u044b \u0438 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430.     \/\/\/ @{      Q_INVOKABLE explicit     FWUsbInstance(bool          aTimerMode = false \/* Thread or Manual*\/,                   TUsbLogLevel  aLogLevel  = LIBUSB_LOG_LEVEL_ERROR \/*LIBUSB_LOG_LEVEL_DEBUG*\/,                   QObject*      aParent    = Q_NULLPTR);      \/\/\/ @}      BaseClass*     AsBaseClass () Q_DECL_OVERRIDE     { return AsClass&lt;BaseClass&gt;(); }      bool     IsValid () const Q_DECL_OVERRIDE     { return BaseClass::IsValid() && ContextExists (); }      bool     IsActive () const  Q_DECL_OVERRIDE     { return IsValid() && BaseClass::IsActive(); }      virtual void     OpenUsbContext (bool aCloseOldContext = false);      virtual void     CloseUsbContext ();      void     SetContext (TUsbContext* aContext);      virtual bool     ContextExists () const { return NOT_ZERRO(UsbContextAsID ()); }      TUsbContext*     UsbContext () const { return m_context; }      void     MakeUsbDeviceList();      void     Open () Q_DECL_OVERRIDE;      void     Close () Q_DECL_OVERRIDE;      void     Reload ();    protected:      void     Initialisation () Q_DECL_OVERRIDE;      inline FWIdentificator     UsbContextAsID () const { return FWIdentificator(UsbContext()); }      void     ClearUsbDeviceList ();    Q_SIGNALS:      void     sign_ContextChanged (const QObject*);      \/\/\/     void     sign_UsbDeviceAttached (quint8 aBus, quint8 aAddr, quint8 aPort,                             quint16 aVendorID, quint16 aProductID);      \/\/\/     \/\/\/ @brief sign_UsbDeviceDeleted     \/\/\/ @param aDevice     \/\/\/     void     sign_UsbDeviceDetached(quint8 aBus, quint8 aAddr, quint8 aPort,                            quint16 aVendorID, quint16 aProductID);  \/\/    void \/\/    sign_DeviceListChanged (const TUsbDeviceList& aList, \/\/                            const FWUsbInstance*  aInstance); \/\/    void \/\/    sign_UsbDeviceStarted (const FWThreadController* aController);    public Q_SLOTS:      void     slot_OnExecute () Q_DECL_OVERRIDE;      void     slot_OnPause ();      void     slot_OnResume ();      bool     slot_ApplyFilter () Q_DECL_OVERRIDE;      void     slot_OnLoop (); };  \/\/------------------------------------------------------------------------------ \/\/\/ \/\/\/ @brief FWSharedUsbInstance \u0422\u0438\u043f @a QSharedPointer \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043b\u044f \/\/\/ \u043a\u043b\u0430\u0441\u0441\u0430 @a FWUsbInstance \/\/\/ typedef QSharedPointer&lt;FWUsbInstance&gt; FWSharedUsbInstance;  \/\/------------------------------------------------------------------------------  FW_END_NAMESPACE  #endif \/\/ FW_USB_INSTANCE_H <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041c\u0435\u0442\u043e\u0434 FWUsbInstance::Reload() \u043a\u043b\u0430\u0441\u0441\u0430 FWUsbInstance \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0433\u043e USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430.<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>void FWUsbInstance::Reload() {   if(!IsActive()) return;    libusb_set_debug (m_context, LIBUSB_LOG_LEVEL_NONE);    \/\/ \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432   QList&lt;QVector&lt;int&gt; &gt;  _list_prev = m_attached_list;    \/\/ \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 ...   MakeUsbDeviceList();    \/\/ ... \u0438 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440   QList&lt;QVector&lt;int&gt; &gt;  _list_now = m_attached_list;    \/\/ \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0451\u043d\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432   if(!_list_prev.isEmpty ())     for(register int i = 0; i &lt; _list_prev.size (); ++i)       if(_list_now.indexOf (_list_prev.at (i)) &lt; 0)       {         slot_OnMachineEvent(               new FWUsbEvent(                 quint16(_list_prev.at (i).at (3)),\/\/VID                 quint16(_list_prev.at (i).at (4)),\/\/PID                 quint8 (_list_prev.at (i).at (0)),\/\/Bus Number                 quint8 (_list_prev.at (i).at (1)),\/\/Address                 quint8 (_list_prev.at (i).at (2)),\/\/Port Number                 FWUsbEvent::UEI_Detached,));\/\/ \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u044f       }    \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432   if(!_list_now.isEmpty ())     for(register int i = 0; i &lt; _list_now.size (); ++i)       if(!_list_prev.contains (_list_now.at (i)))       {         slot_OnMachineEvent(               new FWUsbEvent(                 quint16(_list_prev.at (i).at (3)),\/\/VID                 quint16(_list_prev.at (i).at (4)),\/\/PID                 quint8 (_list_prev.at (i).at (0)),\/\/Bus Number                 quint8 (_list_prev.at (i).at (1)),\/\/Address                 quint8 (_list_prev.at (i).at (2)),\/\/Port Number                 FWUsbEvent::UEI_Attached));\/\/ \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u044f       }    libusb_set_debug (m_context, m_log_level); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412\u043e\u0442, \u0438 \u0432\u0441\u0451\u2026<br \/>  \u041a\u0430\u043a \u0431\u044b\u043b\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u044b\u0448\u0435, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 <i>QObject<\/i>-\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043e\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWItem<\/i> (\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430 QObject), \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d \u0441\u043b\u043e\u0442 <i>slot_OnMachineEvent()<\/i>   <\/p>\n<pre><code>void FWItem::slot_OnMachineEvent(FWEvent* aEvent) {   if(MachineExists())     Machine()-&gt;PostEvent(aEvent); } <\/code><\/pre>\n<h3>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043a \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0443 \u043f\u043e\u0442\u043e\u043a\u0430.<\/h3>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0433\u0440\u0430\u0444\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043a \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u043c\u0443 \u0433\u0440\u0430\u0444\u0443 \u043f\u043e\u0442\u043e\u043a\u0430.<br \/>  \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <i>FWThread::BeforeMachineStart()<\/i><br \/>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441-\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a <i>FWThread<\/i> \u0438 \u043d\u0430\u0437\u043e\u0432\u0451\u043c \u0435\u0433\u043e <i>FWUsbScanner<\/i>.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u043e\u0434 FWUsbScanner:: BeforeMachineStart()<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>void FWUsbScanner::BeforeMachineStart() {   if(!IsValid ()) return;    if(m_usb.isNull())     m_usb = new FWUsbInstance(m_timer_mode);   m_usb-&gt;SetMachine(Machine());    \/\/\/ @name \u041f\u0435\u0440\u0435\u0441\u044b\u043b\u043a\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432   \/\/\/ @{   QObject::connect(m_usb,&FWUsbInstance::sign_UsbDeviceAttached,                    this, &FWUsbScanner:: sign_UsbDeviceAttached,                    Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));   QObject::connect(m_usb,&FWUsbInstance::sign_UsbDeviceDetached,                    this, &FWUsbScanner:: sign_UsbDeviceDetached,                    Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));   QObject::connect(m_usb,&FWUsbInstance::sign_ContextChanged,                    this, &FWUsbScanner:: sign_ContextChanged,                    Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));    \/\/\/ @}    \/\/ \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430   if(AttachObject (m_usb.data()))     QT_TRY     {       \/\/\/ @name \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a \u041a\u0410 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f USB-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432       \/\/\/ @{        QState* sIdle  = Machine ()-&gt;StateIdle ();        \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u041a\u0410 &quot;\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u043e\u0440\u0442&quot;       FWState* sOpen  = new FWState(Machine ()-&gt;StateGroup ());        \/\/ \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u041a\u0410 &quot;\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&quot;       FWState* sScan  = new FWState(Machine ()-&gt;StateGroup ());       sScan-&gt;setObjectName(&quot;USB Scan&quot;);        \/\/ \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 &quot;\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u043e\u0440\u0442&quot; \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u041a\u0410       Machine()-&gt;AddBranch(sIdle, sOpen);       QObject::connect(sOpen, &FWState::entered,                        m_usb, &FWUsbInstance:: slot_Open,                        Qt::ConnectionType(Qt::DirectConnection |                                           Qt::UniqueConnection));        \/\/ \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 &quot;\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&quot; \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u041a\u0410       Machine()-&gt;AddBranch(FWTaskEvent::ET_TASK, FWTaskEvent::TEI_Opened,                            sOpen, sScan);        if(!m_usb-&gt;IsTimerMode())       {         \/\/ \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u043f\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0443: \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0446\u0438\u043a\u043b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435         \/\/ \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b         FWState* sLoop  = new FWState(Machine ()-&gt;StateGroup ());         Machine()-&gt;AddBranch(sScan, sLoop);         Machine()-&gt;AddBranch(FWEvent::ET_TASK,FWTaskEvent::TEI_Read,                   sLoop, sScan);         QObject::connect(sLoop, &FWState::entered,                          m_usb, &FWUsbInstance:: slot_OnLoop,                          Qt::ConnectionType(Qt::DirectConnection |                                             Qt::UniqueConnection));       }        \/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 &quot;\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&quot;       QObject::connect(sScan, &FWState::entered,                        m_usb, &FWUsbInstance:: slot_OnExecute,                        Qt::ConnectionType(Qt::DirectConnection |                                           Qt::UniqueConnection));        \/\/ \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 &quot;\u041f\u0430\u0443\u0437\u0430&quot; \u043f\u043e\u0441\u043b\u0435 &quot;\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&quot; \u043f\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044e       QObject::connect(Machine(),&FWStateMachine::sign_Paused,                        m_usb,    &FWUsbInstance:: slot_OnPause,                        Qt::DirectConnection);        \/\/ \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e\u0441\u043b\u0435 &quot;\u041f\u0430\u0443\u0437\u0430&quot; \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f       QObject::connect(Machine(),&FWStateMachine::sign_Resumed,                        m_usb,    &FWUsbInstance:: slot_OnResume,                        Qt::DirectConnection);        \/\/\/ @}       return; \/\/ \u0432\u0441\u0451 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435     }     QT_CATCH(QException& e)     {       e.what ();     }    \/\/ \u0441\u043a\u0430\u043d\u0435\u0440 \u043d\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043a, \u0438\u043b\u0438 \u043f\u0440\u0438\u0437\u043e\u0448\u043b\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435   SetAutoDelete();        \/\/ \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u043f\u043e\u0442\u043e\u043a \u043f\u043e\u0441\u043b\u0435 exit()   m_usb-&gt;deleteLater ();  \/\/ \u043f\u0440\u0438\u0431\u0440\u0430\u0442\u044c \u0437\u0430 \u0441\u043e\u0431\u043e\u0439   m_usb = Q_NULLPTR;    exit (EXIT_FAILURE);    \/\/ \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041d\u0435 \u0431\u0443\u0434\u0443 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u2013 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438.<br \/>  \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c \u043d\u0430 \u043f\u0430\u0440\u0443 \u043c\u0435\u0442\u043e\u0434\u0430\u0445:<br \/>  \u041c\u0435\u0442\u043e\u0434 <i>FWUsbInstance:: slot_OnExecute()<\/i> \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432.  <\/p>\n<pre><code>void FWUsbInstance::slot_OnExecute() { \/\/  if(IsTimerMode()) \/\/  {     bool _tm = IsTiming ();     if(_tm) StopTimer ();     Reload ();     if(_tm) StartTimer (10); \/\/  } \/\/  else \/\/    while(IsActive()) \/\/      Reload (); } <\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u2013 \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b. \u0415\u0441\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438, \u0430 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <i>FWUsbScanner::BeforeMachineStart()<\/i> \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0442\u043a\u0443 <i>Machine()-&gt;AddBranch(sScan, sLoop)<\/i>, \u0442\u043e \u0432\u0441\u0451 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0446\u0438\u043a\u043b\u0430 <i>while()<\/i> \u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0447\u043a\u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043f\u043e\u0442\u043e\u043a\u0430. \u0422\u0430\u043a \u0436\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u043e\u0434\u043d\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c <i>Reload()<\/i> \u0432 \u0442\u0435\u043b\u0435 \u0446\u0438\u043a\u043b\u0430.<\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u044d\u0442\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<br \/>  \u041c\u0435\u0442\u043e\u0434 <i>IsActive()<\/i> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u043b\u0430\u0433 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u0430. <br \/>  \u0421\u043b\u043e\u0442 <i>slot_BreakProcess()<\/i> \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 <i>FWItem<\/i> \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0444\u043b\u0430\u0433, <br \/>  \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440   <\/p>\n<pre><code>     QObject::connect(Machine(),&FWStateMachine::sign_Paused,                        m_usb,    &FWUsbInstance:: slot_OnPause,                        Qt::DirectConnection); <\/code><\/pre>\n<p>  \u0421\u043b\u043e\u0442\u044b   <\/p>\n<pre><code>void FWUsbInstance::slot_OnPause() {   slot_BreakProcess(); } <\/code><\/pre>\n<p>  \u0418   <\/p>\n<pre><code>void FWUsbInstance::slot_OnResume() {   slot_ResumeProcess(); } <\/code><\/pre>\n<p>  \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0438 \u0432\u043e\u0437\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u0442\u043e\u043a\u0430.<br \/>  \u0412\u0441\u0451 \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. <br \/>  \u041d\u043e \u043f\u0430\u0443\u0437\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u0446\u0438\u043a\u043b \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f. <br \/>  \u0412 \u0447\u0451\u043c \u0436\u0435 \u0434\u0435\u043b\u043e?<br \/>  \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u041a\u0410 <i>Machine()<\/i> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <i>postEvent()<\/i>, \u0442.\u0435. \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0438\u0445 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u0421\u043b\u043e\u0442 <i>slot_OnExecute()<\/i> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u0442\u043e\u043c \u0436\u0435, \u0433\u0434\u0435 \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442. <br \/>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u0441\u0435 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u0430 <i>slot_OnExecute()<\/i>: \u0446\u0438\u043a\u043b <i>while()<\/i> \u043f\u0440\u043e\u0447\u043d\u043e \u043f\u043e\u0434\u0432\u0435\u0441\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0443. \u0414\u0430\u0436\u0435 \u00ab\u043e\u0436\u0438\u0432\u043b\u0435\u043d\u0438\u0435\u00bb \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043c\u0435\u0442\u043e\u0434\u043e\u043c <i>QCoreApplication::processEvents()<\/i> \u043d\u0435 \u0441\u043f\u0430\u0441\u0451\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e!<\/p>\n<p>  \u0418\u0437\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442 \u0446\u0438\u043a\u043b\u043e\u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430, \u043e\u0442\u0447\u0430\u0441\u0442\u0438, \u0438 \u0432\u044b\u043d\u0443\u0434\u0438\u043b\u043e \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442.<br \/>  \u0420\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f (sLoop) \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043e\u043c \u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.  <\/p>\n<pre><code>void FWUsbInstance::slot_OnLoop() {   if(MachineExists())     Machine()-&gt;PostEvent(FWEvent::ET_TASK,FWTaskEvent::TEI_Read); } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f, \u043c\u043e\u0433\u0443 \u043f\u043e\u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u00ab\u0436\u0430\u0434\u043d\u0438\u0447\u0430\u0442\u044c\u00bb \u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u041a\u0410. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0432 \u0442\u0435\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0433\u0434\u0435 \u043c\u0435\u043d\u044f\u044e\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0435 \u043b\u0438\u0431\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043d\u0446\u043e\u0432, \u0441\u0430\u043c\u0430 \u0442\u0435\u043e\u0440\u0438\u044f \u041a\u0410 \u041c\u0443\u0440\u0430 \u043e\u0431\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043b\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u044d\u0442\u043e \u2013 \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  \u0412\u043e\u0442, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0438 \u0432\u0441\u0451, \u0447\u0442\u043e \u044f \u0445\u043e\u0442\u0435\u043b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c.<\/p>\n<h1>\u0418\u0442\u043e\u0433<\/h1>\n<p>  <\/p>\n<ul>\n<li>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0438 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 <i>QThread<\/i>.<\/li>\n<li>\u041f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432 Qt \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u043f\u043e\u0442\u043e\u043a\u043e\u0432.<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u00ab\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u0438\u00bb \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432 <i>QThread<\/i> \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <i>QThread<\/i> \u0437\u0430\u0449\u0438\u0449\u0451\u043d\u043d\u043e\u0433\u043e (protected) \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u043a\u043b\u0430\u0441\u0441\u0430.<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043e\u0432\u0435\u0442\u044b \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <i>QThread_helper<\/i> \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u043c \u0446\u0438\u043a\u043b\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0430.<\/li>\n<li>\u041f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0433\u0440\u0430\u0444\u0430 \u041a\u0410 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u043c.<\/li>\n<li>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <i>libUSB<\/i>.<\/li>\n<li>\u041f\u043e\u043a\u0430\u0437\u0430\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432 \u043e\u0442 <i>QEvent<\/i>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0433\u0438\u0431\u043a\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0442\u0438\u043f\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0434\u043b\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043d\u0443\u0436\u0434.<\/li>\n<\/ul>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f<\/h2>\n<p>  <b>\u0426\u0435\u043b\u044c\u044e \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435 \u0441\u0442\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u044b\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432.<\/b><br \/>  \u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c <b>\u0434\u043e\u043d\u0435\u0441\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0434\u0435\u044e (\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e)<\/b>. \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043b\u043e\u0436\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0432 \u0441\u0438\u043b\u0443 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432. \u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u044b\u0435 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0438 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043d\u044f\u0442\u044c \u0441\u0430\u043c\u0443 \u0441\u0443\u0442\u044c, \u0430 \u044d\u0442\u043e \u0438 \u044f\u0432\u043b\u044f\u043b\u043e\u0441\u044c \u0446\u0435\u043b\u044c\u044e \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>  \u0423 \u043c\u0435\u043d\u044f \u043d\u0435\u0442 \u0434\u0430\u0440\u0430 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430. \u041f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0437\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u00ab\u043a\u043e\u0440\u044f\u0432\u044b\u0435\u00bb \u043e\u0431\u043e\u0440\u043e\u0442\u044b.<\/p>\n<p>  \u042f \u043d\u0435 \u0447\u0430\u0441\u0442\u043e \u0437\u0430\u0433\u043b\u044f\u0434\u044b\u0432\u0430\u044e \u0432 \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u044f\u0449\u0438\u043a \u2013 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e-\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0430\u0443\u0442\u0438\u0437\u043c. \ud83d\ude42 \u041f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c, \u0435\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043e\u043f\u043e\u0437\u0434\u0430\u0435\u0442.<\/p>\n<h3>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u044c\u043d\u044b\u0435 \u043b\u0438\u0441\u0442\u0438\u043d\u0433\u0438<\/h3>\n<div class=\"spoiler\"><b class=\"spoiler_title\">FWStateMachine.h<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>#ifndef FWSTATEMACHINE_H #define FWSTATEMACHINE_H  #ifndef QSTATEMACHINE_DEBUG #   define QSTATEMACHINE_DEBUG #endif  #include &quot;FWState.h&quot;  FW_BEGIN_NAMESPACE   \/\/------------------------------------------------------------------------------ \/\/\/ \/\/\/ @brief \u041a\u043b\u0430\u0441\u0441 FWStateMachine \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 &quot;\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442&quot;. \/\/\/ @see QStateMachine \/\/\/ class     #ifdef FW_LIBRARY         FW_SHARED_EXPORT     #else         Q_DECL_EXPORT     #endif FWStateMachine : public QStateMachine {     friend class FWThread;     Q_OBJECT      Q_CLASSINFO(&quot;brief&quot;,          &quot;Finite-state machine Class&quot;)     Q_CLASSINFO(&quot;created&quot;,        &quot;03-JUN-2015&quot;)     Q_CLASSINFO(&quot;modified&quot;,       &quot;03-JUN-2015&quot;)     \/\/     Q_CLASSINFO(&quot;project&quot;,        &quot;Common Qt-based Framework&quot;)     \/\/     Q_CLASSINFO(&quot;info_en&quot;,        &quot;https:\/\/en.wikipedia.org\/wiki\/Finite-state_machine&quot;)     Q_CLASSINFO(&quot;info_ru&quot;,        &quot;https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82&quot;)      \/\/\/ @name \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043a\u043b\u0430\u0441\u0441\u0430.     \/\/\/ @{     \/\/\/ \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438     typedef QStateMachine BaseClass;     \/\/\/ @}    \/\/----------------------------------------------------------------------------   private:     \/\/\/     \/\/\/ @brief \u0410\u0442\u0440\u0438\u0431\u0443\u0442 m_final_signals \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043a\u0430\u043a \u043a\u043b\u044e\u0447\u0435\u0439     \/\/\/ \u0441 \u0441\u0438\u0433\u043d\u0430\u043b\u0430\u043c\u0438 \u043a\u0430\u043a \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0449\u0438\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 (\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439     \/\/\/ \u0430\u0432\u0442\u043e\u043c\u0430\u0442) \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b.     \/\/\/ @value FWFinalSignalsMap::key() \u041a\u043b\u044e\u0447 \u043a\u0430\u0440\u0442\u044b. \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442,     \/\/\/ \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0434\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u043a\u0430\u043a     \/\/\/ \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430;     \/\/\/ @value FWFinalSignalsMap::value () \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0430 \u043a\u0430\u0440\u0442\u044b. \u0421\u0438\u0433\u043d\u0430\u043b     \/\/\/ \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u043a\u0430\u043a \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430,     \/\/\/ \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c-\u043a\u043b\u044e\u0447\u043e\u043c \u043a\u0430\u0440\u0442\u044b.     \/\/\/     QScopedPointer&lt;FWState&gt; m_state_group;      \/\/\/     \/\/\/ @brief \u041e\u0431\u044a\u0435\u043a\u0442 m_history_state \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435     \/\/\/ \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u043e\u0434\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.     \/\/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f  \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 &quot;\u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439&quot; \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u041a\u0410. \u0421\u0443\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0432 \u0442\u043e\u043c,     \/\/\/ \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043c\u043e\u0433 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443,     \/\/\/ \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u043e\u043d \u0434\u0435\u043b\u0430\u043b     \/\/\/ \u0440\u0430\u043d\u044c\u0448\u0435 (\u0442.\u0435. \u0432\u0435\u0440\u043d\u0443\u0442\u0441\u044f \u0432 \u043f\u0440\u0435\u0436\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435, \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435,     \/\/\/ \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f @sa m_state_main)     \/\/\/     \/\/\/ @note \u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043a\u0430\u043a \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e, \u0434\u043b\u044f     \/\/\/ \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435; \u043a\u043e\u0433\u0434\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442     \/\/\/ \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f     \/\/\/ \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043e\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 (\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435) \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0435     \/\/\/ \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.     \/\/\/ \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 - \u044d\u0442\u043e, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432     \/\/\/ \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0431\u044b\u043b \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d;     \/\/\/ \u0430\u0432\u0442\u043e\u043c\u0430\u0442, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 &quot;\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442&quot; \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u043c\u0443     \/\/\/ \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e. (\\a http:\/\/doc.crossplatform.ru\/qt\/4.7.x\/statemachine-api.html)     \/\/\/     QScopedPointer&lt;QHistoryState&gt; m_state_history;      \/\/\/     \/\/\/ @brief \u0410\u0442\u0440\u0438\u0431\u0443\u0442 m_final_state \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u044b\u0439 \u043a \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0443     \/\/\/ \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e     \/\/\/ \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u043a\u0430\u043a \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.     \/\/\/     QScopedPointer&lt;QFinalState&gt; m_state_final;      \/\/\/     \/\/\/ @brief \u0410\u0442\u0440\u0438\u0431\u0443\u0442 m_state_error \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u044b\u0439 \u043a \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0443     \/\/\/ \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.     \/\/\/     QScopedPointer&lt;FWState&gt; m_state_error;    \/\/----------------------------------------------------------------------------   public:      explicit     FWStateMachine(QObject* aParent = Q_NULLPTR);      explicit     FWStateMachine(QState::ChildMode  aChildMode,                    QObject*           aParent = Q_NULLPTR);       BaseClass*     AsBaseClass() { return qobject_cast&lt;BaseClass*&gt;(this); }      bool     StateGroupExists () const { return !m_state_group.isNull (); }      FWState*     StateGroup () const     { return StateGroupExists () ? m_state_group.data () : Q_NULLPTR; }      inline FWState*     StateIdle () const     {       return           StateGroupExists () ?             qobject_cast&lt;FWState*&gt;(StateGroup()-&gt;initialState ()):             Q_NULLPTR;     }      inline bool     StateHistoryExists () const { return !m_state_history.isNull (); }      inline QHistoryState*     StateHistory () const     { return StateHistoryExists () ? m_state_history.data () : Q_NULLPTR; }      inline bool     StateFinalExists () const { return !m_state_final.isNull (); }      inline QFinalState*     StateFinal () const     { return StateFinalExists () ? m_state_final.data () : Q_NULLPTR; }      inline bool     StateErrorExists () const { return !m_state_error.isNull (); }      inline FWState*     StateError () const     { return StateErrorExists () ? m_state_error.data () : Q_NULLPTR; }      \/\/\/     \/\/\/ @brief \u041c\u0435\u0442\u043e\u0434 IsValid \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043a\u0430\u043a     \/\/\/ \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435.     \/\/\/ @note \u041d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u0445\u043e\u0442\u044f     \/\/\/ \u0431\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b.     \/\/\/ @return \u0411\u0443\u043b\u0435\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043a \u0440\u0430\u0431\u043e\u0442\u0435:     \/\/\/ @value TRUE \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0433\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435;     \/\/\/ @value FALSE \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432 \u043a \u0440\u0430\u0431\u043e\u0442\u0435: \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u043e\u0442\u044f \u0431\u044b     \/\/\/ \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b c \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 @sa SubscribeFinalSignal;     \/\/\/ @see SubscribeFinalSignal     \/\/\/     virtual bool     IsValid () const { return NOT_NULL(initialState ()); }      virtual bool     IsActive () const { return isRunning (); }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 PostEvent \u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWEvent \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c      * \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0439 \u041a\u0410.      * @param aEvent \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0442\u0438\u043f\u0430 @sa FWEvent;      * @param priority \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f.      *\/     inline void     PostEvent(FWEvent* aEvent, EventPriority priority = NormalPriority)     {       if(NOT_NULL(aEvent))         BaseClass::postEvent (aEvent-&gt;AsBaseClass (), priority) ;     }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 PostEvent \u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0442\u0438\u043f\u0430 @sa FWEventType \u0441 \u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c      * \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u044b\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0432 \u043e\u0447\u0435\u043e\u0435\u0434\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0439 \u041a\u0410.      * @param aEventType      * @param aID      * @param priority      *\/     inline void     PostEvent(FWEvent::FWEventType aEventType, FWIdentificator aID,               EventPriority priority = NormalPriority)     {       PostEvent (new FWEvent(aEventType,aID), priority) ;     }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 postDelayedEvent \u043f\u0435\u0440\u0435\u043b\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439      * \u043c\u0435\u0442\u043e\u0434 @sa QStateMachine::postDelayedEvent \u043f\u043e \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f      * \u0442\u0438\u043f\u0430 @sa FWEvent \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0439 \u041a\u0410 c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439      * \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f.      * @param aEvent \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0442\u0438\u043f\u0430 @sa FWEvent;      * @param aDelay \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0432 \u043c\u0438\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445.      * @return \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c, \u0438\u043b\u0438 -1 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435      * \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.      *\/     inline int     PostDelayedEvent(FWEvent* aEvent, int aDelay)     {       if(NOT_NULL(aEvent))         return BaseClass::postDelayedEvent (aEvent-&gt;AsBaseClass (), aDelay) ;       return -1;     }      \/**      * @brief PostDelayedEvent      * @param aEventType      * @param aID      * @param aDelay      *\/     inline void     PostDelayedEvent(FWEvent::FWEventType aEventType, FWIdentificator aID,               int aDelay)     {       PostDelayedEvent(new FWEvent(aEventType,aID), aDelay) ;     }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 Configuration \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 @sa QStateMachine::configuration      * \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0442\u0438\u043f\u0443 @sa FWState \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439.      * @return \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0442\u0438\u043f\u0430 @sa FWState \u041a\u0410.      *\/     QSet&lt;FWState*&gt;     Configuration() const;      \/\/\/ @name \u0413\u0440\u0443\u043f\u043f\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0435\u0442\u0432\u0435\u0439 \u0433\u0440\u0430\u0444\u0430 \u041a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430     \/\/\/ @{      \/**      * @brief AddBranch      * @param aSource      * @param aTarget      * @return      *\/     virtual bool     AddBranch ( QState* aSource, QAbstractState* aTarget )     {       if(NOT_NULL(aSource))         return aSource-&gt;addTransition(aTarget);       return false;     }      \/**      * @brief AddBranch      * @param aEventType      * @param aID      * @param aSource      * @param aTarget      * @return      *\/     virtual bool     AddBranch ( QEvent::Type    aEventType,                 FWIdentificator aID,                 QState* aSource, QAbstractState* aTarget = Q_NULLPTR );      \/**      * @brief AddBranch      * @param aEventType      * @param aID      * @param aSource      * @param aTarget      * @return      *\/     virtual bool     AddBranch ( FWEvent::FWEventType  aEventType,                 FWIdentificator       aID,                 QState* aSource, QAbstractState* aTarget = Q_NULLPTR );      \/**      * @brief AddBranch      * @param aEvent      * @param aSource      * @param aTarget      * @return      *\/     virtual bool     AddBranch ( FWEvent* aEvent,                 QState* aSource, QAbstractState* aTarget = Q_NULLPTR );      \/\/\/ @}   \/\/----------------------------------------------------------------------------   protected:      \/\/\/     \/\/\/ @brief \u041c\u0435\u0442\u043e\u0434 Initialisation     \/\/\/     virtual void     Initialisation ();    \/\/----------------------------------------------------------------------------   Q_SIGNALS:      \/\/\/     \/\/\/ @brief \u0421\u0438\u0433\u043d\u0430\u043b sign_Paused \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0435\u0442 \u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u041a\u0410 \u0432 \u0440\u0435\u0436\u0438\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f.     \/\/\/     void     sign_Paused ();      \/\/\/     \/\/\/ @brief \u0421\u0438\u0433\u043d\u0430\u043b sign_Resumed \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0435\u0442 \u043e \u0432\u044b\u0445\u043e\u0434\u0435 \u041a\u0410 \u0438\u0437 \u0440\u0435\u0436\u0438\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f.     \/\/\/ @see QStateMachine::started, QStateMachine::stopped     \/\/\/     void     sign_Resumed ();    \/\/----------------------------------------------------------------------------   public Q_SLOTS:      \/\/\/     \/\/\/ @brief \u0421\u043b\u043e\u0442 slot_Pause \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u041a\u0410 \u0432 \u0440\u0435\u0436\u0438\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f.     \/\/\/     void     slot_Pause ()     { postEvent (new FWInternalEvent(FWInternalEvent::OEI_Pause)); }      \/\/\/     \/\/\/ @brief \u0421\u043b\u043e\u0442 slot_Resume \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0432\u044b\u0432\u043e\u0434\u0430 \u041a\u0410 \u0438\u0437 \u0440\u0435\u0436\u0438\u043c\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f.     \/\/\/     void     slot_Resume ()     { postEvent (new FWInternalEvent(FWInternalEvent::OEI_Resume)); }    \/\/----------------------------------------------------------------------------   protected Q_SLOTS:      \/\/\/     \/\/\/ @brief slot_OnLoging     \/\/\/     virtual void     slot_OnLoging ()     { qDebug() &lt;&lt; qPrintable(Q_FUNC_INFO); }      \/\/\/     \/\/\/ @brief slot_OnError     \/\/\/     virtual void     slot_OnError ()     { qDebug() &lt;&lt; qPrintable(Q_FUNC_INFO); }      \/\/\/     \/\/\/ @brief slot_OnPaused     \/\/\/     virtual void     slot_OnPaused ()     {       qDebug() &lt;&lt; qPrintable(Q_FUNC_INFO);       if(thread ())         thread ()-&gt;yieldCurrentThread ();       emit sign_Paused();     }      \/\/\/     \/\/\/ @brief slot_OnResume     \/\/\/     virtual void     slot_OnResume ()     {       qDebug() &lt;&lt; qPrintable(Q_FUNC_INFO);       emit sign_Resumed();     }      \/\/\/     \/\/\/ @brief slot_OnStop     \/\/\/     virtual void     slot_OnStop ()     {       qDebug() &lt;&lt; qPrintable(Q_FUNC_INFO);     }      \/\/\/     \/\/\/ @brief slot_OnDefaultHistoryChanged     \/\/\/     virtual void     slot_OnDefaultHistoryChanged()     {       if(StateHistoryExists ())         if(NOT_NULL(StateHistory()-&gt;defaultState()))           qDebug() &lt;&lt; &quot;-H-&quot; &lt;&lt; StateHistory()-&gt;defaultState()-&gt;objectName();     } }; \/\/------------------------------------------------------------------------------  FW_END_NAMESPACE  #endif \/\/ FWSTATEMACHINE_H <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">FWStateMachine.cpp<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>#include &quot;FWStateMachine.h&quot; #include &quot;FWTransition.h&quot; #include &lt;QDebug&gt;  FW_USING_NAMESPACE  \/\/------------------------------------------------------------------------------ FWStateMachine::FWStateMachine(QObject* aParent)   : BaseClass       (aParent)   , m_state_group   (Q_NULLPTR)   , m_state_history (Q_NULLPTR)   , m_state_final   (Q_NULLPTR)   , m_state_error   (Q_NULLPTR) {   Initialisation (); }  \/\/------------------------------------------------------------------------------ FWStateMachine::FWStateMachine(QState::ChildMode  aChildMode,                                QObject*           aParent)   : FWStateMachine(aParent) {   BaseClass::setChildMode (aChildMode); }  \/\/------------------------------------------------------------------------------ QSet&lt;FWState*&gt; FWStateMachine::Configuration() const {   QSet&lt;FWState*&gt; _retval;    QSet&lt;QAbstractState*&gt; _as =  BaseClass::configuration ();   Q_FOREACH(QAbstractState* _s, _as)     _retval.operator += (qobject_cast&lt;FWState*&gt;(_s));   return  _retval; }  bool FWStateMachine::AddBranch(QEvent::Type aEventType, FWIdentificator aID,                           QState* aSource, QAbstractState* aTarget) {   if(NOT_NULL(aSource))     if(aSource-&gt;inherits(FW_CLASS_STR(FWState).toLatin1 ()))       return qobject_cast&lt;FWState*&gt;(aSource)-&gt;addTransition(aEventType, aID,                                                            aTarget);   return false; }  bool FWStateMachine::AddBranch(FWEvent::FWEventType aEventType,                                FWIdentificator aID,                                QState* aSource, QAbstractState* aTarget) {   if(NOT_NULL(aSource))   {     if(aSource-&gt;inherits(FW_CLASS_STR(FWState).toLatin1 ()))       return qobject_cast&lt;FWState*&gt;(aSource)-&gt;addTransition(aEventType, aID,                                                            aTarget);     else     {       QEventTransition* t = new QEventTransition(                               (QObject*)aID,                               static_cast&lt;QEvent::Type&gt;(aEventType), aSource);       if(NOT_NULL(aTarget))         t-&gt;setTargetState(aTarget);       return true;     }   }   return false; }  bool FWStateMachine::AddBranch(FWEvent* aEvent, QState* aSource, QAbstractState* aTarget) {   if(NOT_NULL(aSource))   {     if(aSource-&gt;inherits(FW_CLASS_STR(FWState).toLatin1 ()))       return qobject_cast&lt;FWState*&gt;(aSource)-&gt;addTransition(aEvent, aTarget);     else     {       QEventTransition* t = new QEventTransition(                               (QObject*)(aEvent-&gt;Identificator()),                               aEvent-&gt;type(), aSource);       if(NOT_NULL(aTarget))         t-&gt;setTargetState(aTarget);       return true;     }   }   return false; }  \/\/------------------------------------------------------------------------------ void FWStateMachine::Initialisation() {   bool v_active = IsActive ();   if(v_active)     stop ();    \/\/\/ @name \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u041a\u0410   \/\/\/ @{   if(!StateGroupExists ())     m_state_group.reset (new FWState(this));    FWState* sIdle = new FWState(StateGroup ());   StateGroup ()-&gt;setInitialState (sIdle);   \/\/\/ @}    \/\/\/ @name \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u041a\u0410   \/\/\/ @{   if(!StateHistoryExists ())     m_state_history.reset (new QHistoryState(QHistoryState::DeepHistory,StateGroup ()));    \/\/\/ \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0446\u0435\u043b\u0438, \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435   \/\/\/ \u0433\u043b\u0443\u0431\u043e\u043a\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438-\u043f\u043e\u0442\u043e\u043c\u043a\u0435 @sa m_state_group, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0435   \/\/\/ \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0438\u0437 \u043d\u0435\u0433\u043e \u0432\u044b\u0448\u043b\u0438.   StateHistory ()-&gt;setHistoryType (QHistoryState::DeepHistory);    \/\/\/ @}    \/\/\/ @name \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438z \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u041a\u0410   \/\/\/ @{   if(!StateFinalExists ())     m_state_final.reset (new QFinalState(this));   StateFinal()-&gt;setObjectName(&quot;State FINAL&quot;);   \/\/\/ @}    \/\/\/ @name \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u041a\u0410   \/\/\/ @{   if(!StateErrorExists ())     m_state_error.reset (new FWState(this));    \/\/\/ @}    \/\/\/ @name \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u041a\u0410   \/\/\/ @{    AddBranch(FWEvent::ET_INTERNAL,FWInternalEvent::OEI_Stop,             StateGroup (), StateFinal ());   AddBranch(FWEvent::ET_INTERNAL,FWInternalEvent::OEI_Error,             StateGroup (), StateError ());    \/\/\/ @}    \/\/\/ @name \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b   \/\/\/ @{    FWState* sPause = new FWState(this);   AddBranch(FWEvent::ET_INTERNAL,FWInternalEvent::OEI_Pause,             StateGroup (), sPause);   AddBranch(FWEvent::ET_INTERNAL,FWInternalEvent::OEI_Resume,             sPause, StateHistory ());    \/\/\/ @}    \/\/\/ @name \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438   \/\/\/ @{   AddBranch(StateError (), StateFinal ());   \/\/\/ @}    \/\/\/ @name \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u041a\u0410   \/\/\/ @{    connect( sPause,&FWState::        entered,            this,  &FWStateMachine:: slot_OnPaused,            Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));   connect( sPause,&FWState::        exited,            this,  &FWStateMachine:: slot_OnResume,            Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));   connect( StateFinal (),&QFinalState::    entered,            this,         &FWStateMachine:: slot_OnStop,            Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));   connect( StateError (),&FWErrorState::   entered,            this,         &FWStateMachine:: slot_OnError,            Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));   connect( StateHistory(),&QHistoryState::defaultStateChanged,            this,          &FWStateMachine::slot_OnDefaultHistoryChanged,            Qt::ConnectionType(Qt::DirectConnection | Qt::UniqueConnection));   \/\/\/ @}    if(NOT_EQUAL(initialState (),StateGroup ()))     setInitialState (StateGroup ());    StateGroup ()-&gt;   setObjectName(&quot;State GROUP&quot;);   StateHistory ()-&gt; setObjectName(&quot;State HISTORY&quot;);   StateError()-&gt;    setObjectName(&quot;State ERROR&quot;);   StateFinal()-&gt;    setObjectName(&quot;State FINAL&quot;);   sPause-&gt;          setObjectName(&quot;State PAUSE&quot;);   sIdle-&gt;           setObjectName(&quot;State IDLE&quot;);    if(v_active) start (); }  \/\/------------------------------------------------------------------------------ <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">FWTransition.h<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>#ifndef FW_TRANSITION_H #define FW_TRANSITION_H  #include &lt;FWEvent&gt; #include &lt;QSignalTransition&gt;  FW_BEGIN_NAMESPACE  \/\/------------------------------------------------------------------------------ class FWState; class FWStateMachine;  \/\/------------------------------------------------------------------------------ \/\/\/ \/\/\/ @brief \u041a\u043b\u0430\u0441\u0441 FWTransition \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0442\u0438\u043f\u0430 @sa FWState \/\/\/ \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0442\u0438\u043f\u0430 @sa FWStateMachine. \/\/\/ \u041a\u043b\u0430\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c @sa QEventTransition. \/\/\/ class     #ifdef FW_LIBRARY         FW_SHARED_EXPORT     #else         Q_DECL_EXPORT     #endif FWTransition : public QAbstractTransition {     Q_OBJECT      Q_CLASSINFO(&quot;brief&quot;,          &quot;Exlusive  Finite-state Class&quot;)     Q_CLASSINFO(&quot;created&quot;,        &quot;03-JUN-2015&quot;)     Q_CLASSINFO(&quot;modified&quot;,       &quot;24-JUN-2015&quot;)     \/\/     Q_CLASSINFO(&quot;project&quot;,        &quot;Common Qt-based Framework&quot;)      Q_PROPERTY(FWIdentificator  eventID                READ             EventID                WRITE            SetEventID                NOTIFY           sign_EventIDChanged)     Q_PROPERTY(QEvent::Type     eventType                READ             EventType                WRITE            SetEventType                NOTIFY           sign_EventTypeChanged)      \/\/----------------------------------------------------------------------------     \/\/\/ @name \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043a\u043b\u0430\u0441\u0441\u0430.     \/\/\/ @{     \/\/\/ \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438     \/\/\/ @see QEventTransition     typedef QAbstractTransition BaseClass;     \/\/\/ @}      Q_ENUMS(TransitionState)    \/\/----------------------------------------------------------------------------   public:      \/**      * @brief \u041f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 TransitionState \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0438\u043f\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430.      *\/     enum TransitionState     {       UndefinedState, \/\/\/&lt; \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430       SignalState,    \/\/\/&lt; \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0435\u0442\u0441\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430       EventState,     \/\/\/&lt; \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f       ErrorState      \/\/\/&lt; \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0448\u0438\u0431\u043a\u0438     };    \/\/----------------------------------------------------------------------------   private:      \/**      * @brief \u0410\u0442\u0440\u0438\u0431\u0443\u0442 m_event \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u044f      * \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0442\u0438\u043f\u0430.      *      * @see FWIdentificator, QEvent, QEvent::Type.      *\/     QEvent::Type    m_event_type;      \/**      * @brief \u0410\u0442\u0440\u0438\u0431\u0443\u0442 m_event_id c\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430      * \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWEvent. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438 \u0442\u0438\u043f\u0430 @sa FWSignalEvent,      * \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u0439 \u043a      * \u0442\u0438\u043f\u0443 @sa FWIdentificator \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c FWIdentificator(&lt;QObject*&gt;).      *      * @see FWTransition::Object, FWTransition::ObjectExists.      *\/     FWIdentificator m_event_id;      \/**      * @brief \u0410\u0442\u0440\u0438\u0431\u0443\u0442 m_state \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430      * @see TransitionState      *\/     TransitionState m_state;    \/\/----------------------------------------------------------------------------   public:      \/**      * @brief \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 FWTransition \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440      * @sa QAbstractTransition::QAbstractTransition.      * @param aSourceState \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430.      *\/     explicit     FWTransition(FWState*  aSourceState = Q_NULLPTR);      \/**      * @brief \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 FWTransition \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044e      * \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0438\u043f\u0430 @sa FWEvent::FWEvent      * @param aEvent \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434;      * @param aSourceState \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430.      *      * &quot;see FWIdentificator, FWEvent, FWState.      *\/     explicit     FWTransition(QEvent*  aEvent,                  FWState* aSourceState = Q_NULLPTR);      \/**      * @brief \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 FWTransition \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044e      * \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0438\u043f\u0430 @sa QEvent::Type.      * @param aEventType \u0422\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434;      * @param aID \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434;      * @param aSourceState \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430.      *      * @see QEvent, FWEvent, FWState, QState.      *\/     explicit     FWTransition(QEvent::Type     aEventType,                  FWIdentificator  aID,                  FWState*         aSourceState = Q_NULLPTR);      \/**      * @brief \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 FWTransition \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044e      * \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0442\u0438\u043f\u0430 @sa FWEvent::FWEventType.      * @param aEventType \u0422\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434;      * @param aID \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434;      * @param aSourceState \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430.      *      * @see QEvent, FWEvent, FWState, QState.      *\/     explicit     FWTransition(FWEvent::FWEventType aEventType,                  FWIdentificator      aID,                  FWState*             aSourceState = Q_NULLPTR)       : FWTransition(static_cast&lt;QEvent::Type&gt;(aEventType), aID, aSourceState)     {}      \/**      * @brief \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 FWTransition \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043f\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044e      * \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f (\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u0434\u043b\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430) \u0442\u0438\u043f\u0430      * @sa FWEvent::ET_INTERNAL.      * @param aID \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434;      * @param aSourceState \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430.      *      * @see QEvent, FWEvent, FWState, QState.      *\/     explicit     FWTransition(FWInternalEvent::FWInternalIdentificators aID,                  FWState*         aSourceState = Q_NULLPTR)       : FWTransition(static_cast&lt;QEvent::Type&gt;(FWEvent::ET_INTERNAL),aID,                      aSourceState)     {}  \/\/    explicit \/\/    FWTransition(QObject*         aSender, \/\/                 const char*      aSignalName, \/\/                 QObject*         aRessiver, \/\/                 const char*      aSlotName, \/\/                 FWState*         aSourceState = Q_NULLPTR);      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 AsBaseClass \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u043a \u0442\u0438\u043f\u0443 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.      * @return \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a \u0442\u0438\u043f\u0443 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.      *\/     inline BaseClass*     AsBaseClass () { return qobject_cast&lt;BaseClass*&gt;(this); }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 EventType \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043a\u0430\u043a @sa QEvent::Type.      * @return \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f.      *\/     inline QEvent::Type     EventType () const { return m_event_type; }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 SetEventType \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f.      * @param aType \u041d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f.      *\/     inline void     SetEventType (const QEvent::Type aType)     {       if(NOT_EQUAL(EventType (),aType))       {         m_event_type = aType;         emit sign_EventTypeChanged (EventType ());       }     }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 Identificator \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e      * \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c.      * @return \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0442\u0438\u043f\u0430 @sa FWIdentificator.      *\/     inline FWIdentificator     EventID () const { return m_event_id; }      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 setEventID \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 @sa m_id \u0432      * \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430.      * @param aID \u041d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430.      *\/     inline void     SetEventID (const FWIdentificator aID)     {       if(NOT_EQUAL(EventID (),aID))       {         m_event_id = aID;         emit sign_EventIDChanged (EventID ());       }     }      FWStateMachine*     Machine () const;      inline bool     operator == (const FWTransition& aOther)     {       return           EQUAL(EventType   (), aOther.EventType  ()) &&           EQUAL(EventID     (), aOther.EventID    ()) &&           EQUAL(sourceState (), aOther.sourceState()) &&           EQUAL(targetState (), aOther.targetState());     }    \/\/----------------------------------------------------------------------------   protected:      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 SetState \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430.      * @param aState \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430      * @sa TransitionState      *\/     virtual void     SetState (TransitionState aState)     {       if(m_state != aState)         m_state = aState;     }      \/**      * @brief  \u041c\u0435\u0442\u043e\u0434 FWTransition::eventTest \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434      * @sa QEventTransition::eventTest \u0434\u043b\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438      * \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043f\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f.      * @param aEvent \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u0438\u0437 \u0432\u043d\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435.      * @return \u041f\u0440\u0438\u0437\u043d\u0430\u043a \u0441\u0440\u0430\u0432\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430:      * @value TRUE \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e, \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d;      * @value FALSE \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u043e\u0442\u0432\u0435\u0440\u0433\u043d\u0443\u0442\u043e, \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d.      *      * \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u043a\u0430\u043a\u0438\u043c-\u043b\u0438\u0431\u043e \u041a\u0410. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e      * \u0441\u043e\u0431\u044b\u0442\u0438\u044e \u0434\u043b\u044f \u041a\u0410, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0432 \u0442\u0435\u043b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWEvent.      * \u0423\u0441\u043b\u043e\u0432\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438: \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0435\u0441\u043b\u0438 \u043e\u043d\u043e &quot;\u043e\u0431\u0432\u0451\u0440\u043d\u0443\u0442\u043e&quot;      * @sa StateMachine::WrappedEvent \u0438\u043b\u0438 @sa StateMachine::SignalEvent;      *      * @see QEvent, QEvent::Type.      * @see QStateMachine, QStateMachine::WrappedEvent\u0431 QStateMachine::SignalEvent.      * @see FWEvent, FWEvent::Machine      *\/     bool     eventTest(QEvent* aEvent) Q_DECL_OVERRIDE;      \/**      * @brief \u041c\u0435\u0442\u043e\u0434 onTransition      * @param aEvent      *\/     void     onTransition(QEvent* aEvent) Q_DECL_OVERRIDE;    \/\/----------------------------------------------------------------------------   Q_SIGNALS:      \/**      * @brief sign_EventTypeChanged      * @param aType      *\/     void     sign_EventTypeChanged (const QEvent::Type aType);      \/**      * @brief \u0421\u0438\u0433\u043d\u0430\u043b sign_eventIDChanged \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0435\u0442 \u043e \u0441\u043c\u0435\u043d\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f      * \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043a \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0443 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 @sa m_id.      * @param aID \u041d\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 @sa m_id.      *      * @see FWIdentificator      *\/     void     sign_EventIDChanged (const FWIdentificator aID);      \/\/\/     \/\/\/ @brief \u0421\u0438\u0433\u043d\u0430\u043b sign_Transiting \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442 \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430     \/\/\/ @param aSource \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442-\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f     \/\/\/ \u043f\u0435\u0440\u0435\u0445\u043e\u0434;     \/\/\/ @param aTarget \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0446\u0435\u043b\u0435\u0432\u043e\u0435 \u043e\u0431\u044a\u0435\u043a\u0442-\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430;     \/\/\/ @param aTransition \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 @sa FWTransition, \u043a\u043e\u0442\u043e\u0440\u044b\u0439     \/\/\/ \u0441\u0442\u0430\u043b \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430.     \/\/\/     void     sign_Transiting (QState* aSource, QAbstractState* aTarget,                      QAbstractTransition* aTransition); }; \/\/------------------------------------------------------------------------------  FW_END_NAMESPACE  #endif \/\/ FWTRANSITION_H <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">FWTransition.cpp<\/b><\/p>\n<div class=\"spoiler_text\">  <\/p>\n<pre><code>#include &quot;FWTransition.h&quot; #include &quot;FWState.h&quot; #include &quot;FWStateMachine.h&quot;  FW_USING_NAMESPACE  \/\/------------------------------------------------------------------------------ FWTransition::FWTransition(FWState* aSourceState)   : BaseClass     (aSourceState) {   SetState(UndefinedState);   SetEventID (EMPTY_ID);   SetEventType (static_cast&lt;QEvent::Type&gt;(QEvent::None)); }  \/\/------------------------------------------------------------------------------ FWTransition::FWTransition(QEvent* aEvent, FWState* aSourceState)   : FWTransition(aSourceState) {   if(NOT_NULL(aEvent))   {     if(!FWEvent::IsSystem (aEvent))     {       SetState(EventState);       SetEventID (static_cast&lt;FWEvent*&gt;(aEvent)-&gt;Identificator ());       SetEventType (aEvent-&gt;type ());     }   }   else     SetState(ErrorState); }  \/\/------------------------------------------------------------------------------ FWTransition::FWTransition(QEvent::Type     aEventType,                            FWIdentificator  aID,                            FWState*         aSourceState)   : FWTransition(aSourceState) {   SetState    (EventState);   SetEventID  (aID);   SetEventType(aEventType); }  \/\/------------------------------------------------------------------------------ \/\/FWTransition::FWTransition(QObject*     aSender, \/\/                           const char*  aSignalName, \/\/                           QObject*     aRessiver, \/\/                           const char*  aSlotName, \/\/                           FWState*     aSourceState) \/\/  : FWTransition  (aSourceState) \/\/{ \/\/  SetState(SignalState); \/\/  SetEventID (FWIdentificator (aSender)); \/\/  SetEventType (static_cast&lt;QEvent::Type&gt;(FWEvent::ET_GLOBAL));  \/\/  if(NOT_NULL(aSender) && NOT_NULL(aRessiver)) \/\/  { \/\/    int v_offset = *aSignalName == '0'+QSIGNAL_CODE ? 1 : 0; \/\/    int v_signal_index = \/\/        aSender-&gt;metaObject ()-&gt;indexOfSignal ( \/\/          QMetaObject::normalizedSignature (aSignalName+v_offset));  \/\/    v_offset = *aSlotName == '0'+QSLOT_CODE ? 1 : 0; \/\/    int v_slot_idx = \/\/        aRessiver-&gt;metaObject ()-&gt;indexOfSlot ( \/\/          QMetaObject::normalizedSignature (aSlotName+v_offset));  \/\/    if(QMetaObject::connect (aSender, v_signal_index, \/\/                             aRessiver, v_slot_idx, \/\/                             Qt::DirectConnection)) \/\/    { \/\/      aRessiver-&gt;setParent (Q_NULLPTR); \/\/      aRessiver-&gt;moveToThread (thread ()); \/\/    } \/\/    else \/\/      SetState(ErrorState); \/\/  } \/\/}  \/\/------------------------------------------------------------------------------ FWStateMachine* FWTransition::Machine() const {   return qobject_cast&lt;FWStateMachine*&gt;(machine ()); }  \/\/------------------------------------------------------------------------------ bool FWTransition::eventTest(QEvent* aEvent) {   bool v_retval = FWEvent::IsValid (aEvent);    if(v_retval)     v_retval = EQUAL(aEvent-&gt;type (),EventType ());    if(v_retval)   {       FWEvent* v_e = static_cast&lt;FWEvent*&gt;(aEvent);       v_retval =           EQUAL(v_e-&gt;type (),         EventType ()) &&           EQUAL(v_e-&gt;Identificator (),EventID   ());   }    return v_retval; }  \/\/------------------------------------------------------------------------------ void FWTransition::onTransition(QEvent* aEvent) {   aEvent-&gt;accept(); \/\/  qDebug() &lt;&lt; &quot;-T- &quot; + \/\/              sourceState ()-&gt;objectName() + \/\/              &quot; --&gt;&gt; &quot; + \/\/              targetState()-&gt;objectName();   emit sign_Transiting (sourceState (),targetState (), this-&gt;AsBaseClass()); }  \/\/------------------------------------------------------------------------------  <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0411\u0443\u0434\u0443 \u0440\u0430\u0434, \u0435\u0441\u043b\u0438 \u043c\u043e\u044f \u0437\u0430\u043c\u0435\u0442\u043a\u0430 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u043b\u0438 \u043d\u0430\u0439\u0442\u0438 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u2026 \u043f\u043e\u0442\u043e\u043a\u043e-\u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0421\u043f\u0430\u0441\u0438\u0431\u043e.     \t<\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/261955\/\"> http:\/\/habrahabr.ru\/post\/261955\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>     \t\u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043a \u044d\u0442\u0430\u043f\u0443, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u0430\u043c. \u0421\u0435\u0439\u0447\u0430\u0441 \u0442\u0440\u0443\u0434\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0431\u0435\u0437 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u0438\u043b\u0438 \u0438\u043d\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 (framework). <br \/>  \u041c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u0437 \u043d\u0438\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 <a href=\"http:\/\/www.qt.io\/qt-framework\/\">Qt Framework<\/a>.<\/p>\n<p>  \u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043c\u0435\u0442\u043e\u0434\u0430\u0445 Qt \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p>  \u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u041f\u041e \u043d\u0430 Qt Framework \u043e\u0433\u0440\u043e\u043c\u043d\u043e. \u041b\u044e\u0434\u0438 \u043e\u0445\u043e\u0442\u043d\u043e \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430\u0432\u044b\u043a\u0430\u043c\u0438 \u0438 \u043f\u0440\u0438\u0451\u043c\u0430\u043c\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043d\u0438\u0433 \u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0438\u0437\u044f\u0449\u043d\u043e\u0433\u043e \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438.<br \/>  \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0432\u0441\u0451 \u0443\u0436\u0435 \u0440\u0435\u0448\u0435\u043d\u043e. \u0427\u0442\u043e \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c?<br \/>  \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u044e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e\u0442\u043e\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430. \u041f\u0440\u0438\u0437\u043d\u0430\u044e\u0441\u044c, \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043b \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b \u0441 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0432 \u0441\u0435\u0442\u0438. <br \/>  \u0415\u0441\u043b\u0438 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u0441 \u0438\u0434\u0435\u0435\u0439, \u0447\u0442\u043e, \u043f\u043e \u043c\u043e\u0435\u043c\u0443 \u043c\u043d\u0435\u043d\u0438\u044e, \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0446\u0435\u043d\u043d\u0435\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0431\u0443\u0434\u0443 \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0434.<\/p>\n<p>  \u0412\u044b\u0440\u0430\u0436\u0430\u044e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u0410. \u041d. \u0411\u043e\u0440\u043e\u0432\u0441\u043a\u043e\u043c\u0443 \u0437\u0430 \u043a\u043d\u0438\u0433\u0443 <a href=\"http:\/\/www.ozon.ru\/context\/detail\/id\/7449666\/\">\u00abQt4.7+.\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 C++\u00bb<\/a>. <br \/>  \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043a \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044e!<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-260884","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/260884","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=260884"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/260884\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=260884"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=260884"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=260884"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}