рдХреНрд╡рд╛рдВрдЯрдо рд▓реАрдкреНрд╕ QP рдФрд░ UML рд░рд╛рдЬреНрдпрдЪрдХреНрд░

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдпрд╣ рд▓реЗрдЦ, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЬреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдЬреЛ рдпреВрдПрдордПрд▓ рд░рд╛рдЬреНрдп рдФрд░ рдЕрдиреБрдХреНрд░рдо рдЖрд░реЗрдЦ (рд╕реНрдЯреЗрдЯрдЪрд░реНрдЯреНрд╕ рдЖрд░реЗрдЦ рдФрд░ рдЕрдиреБрдХреНрд░рдо рдЖрд░реЗрдЦ) рдХреЗ рд╕рд╛рде - рд╕рд╛рде рдШрдЯрдирд╛-рдЙрдиреНрдореБрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ (рдЗрд╡реЗрдВрдЯ-рд╕рдВрдЪрд╛рд▓рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ) рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


рдХреНрд╡рд╛рдВрдЯрдо рд▓реАрдкреНрд╕ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо QP рдлреНрд░реЗрдорд╡рд░реНрдХ (рдХреНрд╡рд╛рдВрдЯрдо рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо) рдХреЛ рдЗрд╕рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдиреЗ COS / C ++ рдореЗрдВ RTOS рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рдзрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рд╡рд┐рдХрд╛рд╕ рдХреА рдЧрддрд┐ рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕рдореЗрдВ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ рд▓реЙрдЧрд┐рдВрдЧ рдЯреВрд▓ рднреА рд╣реЛрдВрдЧреЗред рдЗрди рд╕рднреА рдореЗрдВ рдпрд╣ рддрдереНрдп рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХреНрдпреВрдкреА рдмрд╣реБрдд рд▓рдЪреАрд▓рд╛ рдФрд░ рдЖрд╕рд╛рди рд╣реИ: рдЗрд╕реЗ рдХрдИ рдореЙрдбреНрдпреВрд▓реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдпрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕реНрд╡рдпрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдХрдИ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ precompilation рдХреЗ рджреМрд░рд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

QP-рдШрдЯрдХреЛрдВ

рдХреНрдпреВрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдпреВрдПрдордПрд▓ рд░рд╛рдЬреНрдпрдЪрд░реЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
рдпрд╣ рд▓реЗрдЦ рдХреНрдпреВрдИрдкреА рдореЙрдбреНрдпреВрд▓ рдХреА рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдореАрдХреНрд╖рд╛ рд╣реИ, рдЬреЛ рдХрд┐ рд░реВрдкрд░реЗрдЦрд╛ (рдХреНрдпреВрдИрдкреА рдЗрдореНрдкреНрд▓рд┐рдореЗрдВрдЯреНрд╕ рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ) рдХрд╛ рдЖрдзрд╛рд░ рд╣реИ, рдФрд░ рдЖрдЧреЗ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред

QP рдореЗрдВ рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо


рд░рд╛рдЬреНрдп рдЖрд░реЗрдЦреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрдпреВрдкреА рдПрдХ рдпреВрдПрдордПрд▓-рд╕рдВрдЧрдд рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдПрдХ рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП: рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд░рдордг рдПрдХ рдирд┐рдХрд╛рд╕ рдШрдЯрдирд╛ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рд╕реБрдкрд░рд╕реНрдЯреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд░рдордг рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдШрдЯрдирд╛ рдирд╣реАрдВ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдпреВрдПрдордПрд▓ 2 рдореЗрдВ, рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдмрд╛рд╣рд░реА рд╕рдВрдХреНрд░рдордг рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЫреЛрдбрд╝реА рдЧрдИ рдереАред рднрд╛рд╖рд╛ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдХреЗрд╡рд▓ рдмрд╛рд╣рд░реА рдкрд░рд┐рд╡рд░реНрддрди рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: рдХрд┐рд╕реА рднреА рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд╛рде рдХреНрд░рдорд╢рдГ рд╡рд░реНрддрдорд╛рди рдФрд░ рд▓рдХреНрд╖реНрдп рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдХрд╛рд╕ рдФрд░ рдкреНрд░рд╡реЗрд╢ рдШрдЯрдирд╛ рд╣реЛрддреА рд╣реИред

рдЫрд╡рд┐

QP рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдирд┐рдореНрди рд╡рд░реНрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
рдПрдХрд▓ рд╕реНрддрд░реАрдп рд░рд╛рдЬреНрдп рдорд╢реАрди (рд╕реБрдкрд░рд╕реНрдЯреЗрдЯ рдХреЗ рдмрд┐рдирд╛) рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП QFsm
рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдСрдЯреЛрдореЗрдЯрди (рд╕реБрдкрд░рд╕реНрдЯреЗрдЯ рдХреЗ рд╕рд╛рде) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП QHsm
рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреА рд╡рд╕реНрддреБрдПрдВ рдпреВрдПрдордПрд▓ рдЖрд░реЗрдЦ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИрдВ, рдФрд░ рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐ void dispatch ( const QEvent * e ) рд╣реИред
QP, QActive рд╡рд░реНрдЧ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ QHsm рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ (рдЗрд╕реЗ QFsm рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдЗрд╕ рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдПрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдХреНрд░рд┐рдп рд╡рд╕реНрддреБ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдорд╢реАрди рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВред

QP рдореЗрдВ рдПрдХ рдШрдЯрдирд╛ QEvent рд╡рд░реНрдЧ рдпрд╛ рдЙрд╕рдХреЗ рд╡рдВрд╢рдЬреЛрдВ рдХреА рдПрдХ рд╡рд╕реНрддреБ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдирд╛ рдХреЛ рдПрдХ рд╕рдВрдХреЗрдд рджреНрд╡рд╛рд░рд╛ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рд╕рд┐рдЧ рдХреНрд╖реЗрддреНрд░ рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдШрдЯрдирд╛ рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред

QP рдореЗрдВ рдПрдХ рдЕрд╡рд╕реНрдерд╛ рдПрдХ рдлрдВрдХреНрд╢рди (рдпрд╛ рд╕реНрдЯреИрдЯрд┐рдХ рдореЗрдердб) рд╣реИ, рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЬрд┐рд╕рдХрд╛ рд░реВрдк рд╣реИ:
typedef QState ( * QStateHandler ) ( void * me, QEvent const * e ) , рдЬрд╣рд╛рдВ рдореЗрд░рд╛ рд╕рдВрджрд░реНрдн рд╣реИ (рдПрдХ рдСрдЯреЛрдореЗрдЯрди рдСрдмреНрдЬреЗрдХреНрдЯ), e рдкреНрд░рд╛рдкреНрдд рдШрдЯрдирд╛ рд╣реИ

рдШрдЯрдирд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдп рддреАрди рдореБрдЦреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд░реВрдкрд░реЗрдЦрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

рдХреНрдпреВрдкреА рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рдШрдЯрдирд╛рдПрдВ рднреА рд╣реИрдВ рдЬреЛ рд╕рдВрдХреНрд░рдордг рдХреЗ рджреМрд░рд╛рди рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЗрди рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╣реЛрдиреЗ рдХрд╛ рдХреНрд░рдо рдФрд░ рд╕рдВрдХреНрд░рдордг рдХреЗ рджреМрд░рд╛рди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
  1. рдкрд░рдорд╛рдгреБ рд╕рдВрдХреНрд░рдордг рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВ;
  2. рдирд┐рдХрд╛рд╕ рдШрдЯрдирд╛ ( Q_EXIT_SIG )ред рдЗрд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реБрдкрд░рд╕реНрдЯреЗрдЯ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд╕реБрдкрд░рд╕реНрдЯреЗрдЯ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рдШрдЯрдирд╛ рдХреЛ рдХреЗрд╡рд▓ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ( Q_HANDLED );
  3. рдорд╢реАрди рд▓рдХреНрд╖реНрдп рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдЪрд▓реА рдЬрд╛рддреА рд╣реИ;
  4. рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдШрдЯрдирд╛ ( Q_ENTRY_SIG )ред рд░рд╛рдЬреНрдп рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╕рдордп рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдШрдЯрдирд╛ рдХреЛ рдХреЗрд╡рд▓ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
  5. рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдШрдЯрдирд╛ Q_INIT_SIG (рдХреЗрд╡рд▓ QHsm- рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП) - рдПрдХ рдЖрд░рдВрдн рдХрд░рдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛ред рдпрд╣ рд╣рдореЗрд╢рд╛ рдЙрдарддрд╛ рд╣реИред рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг ( Q_TRAN ) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдЗрд╕реЗ рдмрд╕ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;

QFsm рд░рд╛рдЬреНрдпреЛрдВ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг:
static QState state1(Fsm* me, const QEvent* e) {
switch (e->sig) {
case Q_ENTRY_SIG: {
/* processing */
return Q_HANDLED();
}
case EVENT1_SIG: {
/* processing */
return Q_TRAN(&state2);
}
case EVENT2_SIG: {
/* processing */
return Q_HANDLED();
}
case Q_EXIT_SIG: {
/* processing */
return Q_HANDLED();
}
}
return Q_HANDLED();
}


* This source code was highlighted with Source Code Highlighter .


QHsm рд░рд╛рдЬреНрдпреЛрдВ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг:
static QState state1(Hsm* me, const QEvent* e) {
switch (e->sig) {
case Q_ENTRY_SIG: {
/* processing */
return Q_HANDLED();
}
case Q_INIT_SIG: {
/* processing */
return Q_TRAN(&state1_substate1); // return Q_HANDLED();
}
case EVENT1_SIG: {
/* processing */
return Q_TRAN(&state2);
}
case EVENT2_SIG: {
/* processing */
return Q_HANDLED();
}
case Q_EXIT_SIG: {
/* processing */
return Q_HANDLED();
}
}
return Q_SUPER(&superstate1);
}


* This source code was highlighted with Source Code Highlighter .


Q_ENTRY_SIG , Q_INIT_SIG , Q_EXIT_SIG рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд╢реЗрд╖ рдШрдЯрдирд╛рдПрдБ рдПрдХ рд╣реА рд░рд╛рдЬреНрдп рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реБрдкрд░рд╕реНрдЯреЗрдЯ рдореЗрдВ рдирд╣реАрдВ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

рдЙрджрд╛рд╣рд░рдг


рдПрдХ рд╕рдХреНрд░рд┐рдп рдСрдмреНрдЬреЗрдХреНрдЯ ( sm ) рдФрд░ рдЙрд╕ рдкрд░ рдПрдХ рддрд░рдлрд╝рд╛ рдкреНрд░рднрд╛рд╡ рд╡рд╛рд▓реА рдкреНрд░рдгрд╛рд▓реА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рдорд▓реНрдЯреАрдЯрд╛рд╕реНрдХрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ ( QK ) рдФрд░ QActive рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



рдмрддрд╛ рджреЗрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдо рдореЗрдВ рдПрдХ рд╕реНрдЯреЗрдЯ рдбрд╛рдпрдЧреНрд░рд╛рдо рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рдкрд░рд┐рдорд┐рдд рд╕реНрдЯреЗрдЯ рдорд╢реАрди рд╣реИред



рдпрд╣ рдЖрдк QP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
//
enum Signals {
PROCEED_SIG = Q_USER_SIG,
CANCEL_SIG,
};

// , PROCEED_SIG
struct ProceedEvt : public QEvent {
ProceedEvt( int value = 0) : value ( value ) { sig = PROCEED_SIG; }
int value ;
};

// , CANCEL_SIG
struct CancelEvt : public QEvent {
CancelEvt() { sig = CANCEL_SIG; }
};

// sm
class Hsm : public QHsm {
public :
Hsm() : QHsm((QStateHandler)&initial) { init(); }

private :
// initial state
static QState initial(Hsm* me, const QEvent* e) {
return Q_TRAN(&superState);
}

static QState superState(Hsm* me, const QEvent* e) {
switch (e->sig) {
case Q_ENTRY_SIG: {
me->count = 10;
return Q_HANDLED();
}
case Q_INIT_SIG: {
return Q_TRAN(&stateA);
}
case CANCEL_SIG: {
return Q_TRAN(&stateC);
}
}

/* QHsm::top - ,
* Q_HANDLED(). */
return Q_SUPER(&QHsm::top);
}

static QState stateA(Hsm* me, const QEvent* e) {
switch (e->sig) {
case PROCEED_SIG: {
return Q_TRAN(&stateB);
}
}
return Q_SUPER(&superState);
}

static QState stateB(Hsm* me, const QEvent* e) {
switch (e->sig) {
case PROCEED_SIG: {
if (me->count > 1) {
me->count *= 2;
return Q_TRAN(&stateA);
}
++me->count;
return Q_HANDLED();
}
case Q_EXIT_SIG: {
cout << "count = " << me->count << endl;
me->count = 0;
return Q_HANDLED();
}
}
return Q_SUPER(&superState);
}

static QState stateC(Hsm* me, const QEvent* e) {
switch (e->sig) {
case PROCEED_SIG: {
if (static_cast< const ProceedEvt*>(e)-> value == 1) {
return Q_TRAN(&superState);
}
break ;
}
}
return Q_SUPER(&QHsm::top);
}

int count;
};


* This source code was highlighted with Source Code Highlighter .


рдЕрдм рдХрдХреНрд╖рд╛ Hsm рдХреА рдПрдХ рд╕реНрдорд╛рдЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ (рдКрдкрд░ рджрд┐рдП рдЧрдП рдЕрдиреБрдХреНрд░рдо рдЖрд░реЗрдЦ рджреЗрдЦреЗрдВ) рдФрд░ рдПрдХ рджрд░реНрдЬрди рдШрдЯрдирд╛рдУрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВ:
int main( int argc, char * argv[]) {
Hsm sm; // stateA, count = 10

for ( int i = 0; i < 2; ++i) {
sm.dispatch(&ProceedEvt()); // stateB, count = 10
sm.dispatch(&ProceedEvt()); // stateA, count = 0
sm.dispatch(&ProceedEvt()); // stateB, count = 0
sm.dispatch(&ProceedEvt()); // stateB, count = 1
sm.dispatch(&ProceedEvt()); // stateB, count = 2
sm.dispatch(&ProceedEvt()); // stateA, count = 0
sm.dispatch(&ProceedEvt()); // stateB, count = 0
sm.dispatch(&ProceedEvt()); // stateB, count = 1
sm.dispatch(&ProceedEvt()); // stateB, count = 2
sm.dispatch(&CancelEvt()); // stateC, count = 2
sm.dispatch(&CancelEvt()); // stateC, count = 2
sm.dispatch(&ProceedEvt()); // stateC, count = 2
sm.dispatch(&ProceedEvt(1)); // stateA, count = 10
}

return 0;
}


* This source code was highlighted with Source Code Highlighter .


рдирд┐рд╖реНрдХрд░реНрд╖


рдпреВрдПрдордПрд▓ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдЕрдиреНрдп рд╕рд╛рдзрди: рдЫрджреНрдо рд░рд╛рдЬреНрдп рдкреНрд░рд╛рд░рдВрднрд┐рдХ, рдЕрдВрддрд┐рдо, рдЗрддрд┐рд╣рд╛рд╕, рдЧрд╣рд░рд╛ рдЗрддрд┐рд╣рд╛рд╕ рдФрд░ рдЕрдиреНрдп; рд╕реНрдердЧрд┐рдд рдШрдЯрдирд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг, рд░рд╛рдЬреНрдп рдХреЗ рдСрд░реНрдереЛрдЧреЛрдирд▓ рдШрдЯрдХ, рдЫрд┐рдкреА рд╣реБрдИ рд╕реНрдерд┐рддрд┐, рдЖрджрд┐ рдХреЛ "рд░рд╛рдЬреНрдп рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкрд╛рдВрдЪ рдкреБрд╕реНрддрдХ рдореЗрдВ рджрд┐рдП рдЧрдП рд╣реИрдВ, рдЬрд┐рдирдХреА рдореИрдВ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХрд░реВрдВрдЧрд╛ред

QP рдХреЗ рд▓рд╛рдн

рдХрд┐рддрд╛рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

QP рдПрдХ рдмрдбрд╝реА рдкреБрд╕реНрддрдХ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, C / C ++ рдореЗрдВ рдкреНрд░реИрдХреНрдЯрд┐рдХрд▓ рдпреВрдПрдордПрд▓ рд╕реНрдЯреЗрдЯрдЪрд░реНрд╕, рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг: рдХреНрд╡рд╛рдВрдЯрдо рд▓реАрдкреНрд╕ рдХреЗ рд╕рдВрд╕реНрдерд╛рдкрдХ рд╕реЗ рдПрдВрдмреЗрдбреЗрдб рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЗрд╡реЗрдВрдЯ-рдбреНрд░рд┐рд╡реНрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ, рдЬрд┐рд╕реЗ 2 рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдкрд╣рд▓рд╛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдФрд░ рджреВрд╕рд░рд╛ рдПрдХред рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП QP рдХреЛ рдХреИрд╕реЗ рддреЗрдЬ рдХрд░реЗрдВ, QS рдЯреНрд░реИрд╕рд░ (QSpy) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдФрд░ QP-nano рдХреНрдпрд╛ рд╣реИред

рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ, рд╕реНрдЯреЗрдЯ рдкреИрдЯрд░реНрди рдФрд░ рд╕реНрд╡рд┐рдЪ рд╡рд┐рдзрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рддреБрд▓рдирд╛ рднреА рдХрд░рддрд╛ рд╣реИред

рдкреБрд╕реНрддрдХ рдореЗрдВ рдкреИрд╕рд╛ рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди "рдореБрдлреНрдд рдбрд╛рдЙрдирд▓реЛрдб" рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдВрджрд░реНрдн

Source: https://habr.com/ru/post/In114239/


All Articles