C++ Builder XE4 > TTimer > 버스트 기능(가칭) 구현 > 1초 간격에 대해 0.1초 간격으로 처리

운영 환경
C++ Builder XE4

처리 개요


  • 1초 간격의 처리가 있다
  • 어떤 기능만 0.1초 간격으로 하고 싶다

  • 구현안


  • 1초 간격으로 0.1초 간격의 TTimer를 이동한다.
  • TMR_1sec: 1초 간격
  • TMR_burst: 0.1초 간격


  • 코드 v0.1



    Unit1.h
    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <System.Classes.hpp>
    #include <Vcl.Controls.hpp>
    #include <Vcl.StdCtrls.hpp>
    #include <Vcl.Forms.hpp>
    #include <Vcl.ExtCtrls.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:    // IDE で管理されるコンポーネント
        TTimer *TMR_1sec;
        TMemo *Memo1;
        TButton *B_start;
        TTimer *TMR_burst;
        TCheckBox *CHK_burst;
        void __fastcall TMR_1secTimer(TObject *Sender);
        void __fastcall B_startClick(TObject *Sender);
        void __fastcall TMR_burstTimer(TObject *Sender);
    private:    // ユーザー宣言
    public:     // ユーザー宣言
        __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Unit1.cpp
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    
    /*
    @spec: 2018/03/08 TMR_burst->Tagをカウントダウンとして使う
    */
    
    
    void __fastcall TForm1::TMR_1secTimer(TObject *Sender)
    {
        String wrk = Now().FormatString(L"hh:nn:ss.zzz");
        Memo1->Lines->Add(wrk);
    
        if (CHK_burst->Checked) {
            TMR_1sec->Enabled = false;  // 連射時は1秒タイマーは1回だけにする
            TMR_burst->Interval = 100;  // msec
            TMR_burst->Tag = 10 - 1;  // カウントダウン, 1: 実施済みの分
            TMR_burst->Enabled = true;
        }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::B_startClick(TObject *Sender)
    {
        TMR_1sec->Interval = 1000; // msec
        TMR_1sec->Enabled = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::TMR_burstTimer(TObject *Sender)
    {
        String wrk = Now().FormatString(L"hh:nn:ss.zzz");
        Memo1->Lines->Add(wrk);
    
        TMR_burst->Tag -= 1;  // Tag:カウントダウン用
        if (TMR_burst->Tag == 0) {
            TMR_burst->Enabled = false;
        }
    }
    //---------------------------------------------------------------------------
    
    Memo1->Lines->Add(wrk); 처리는 함수화해, 2개소로부터 invoke 하는 것이 더 좋지만, 이 기사에서는 여기까지.

    UDP 통신이나 TCP/IP 통신의 경우, 상대로부터의 응답 시간도 있으므로, 100msec로 처리가 끝나지 않는 경우도 있다. 시험중인 장치에서 UDP 통신은 100msec에서 가능했다.

    실행 예





    버스트 모드에서 7of9 Powered by Qiita and Qiita users
    ( 동기 부여가 없을 때의 3 배 정도)

    링크


  • '정신과 시간의 방' 명령을 만들었다
  • '정신과 시간의 방' 페이지를 만들었다

  • 버스트 모드는 소모가 심하기 때문에 장시간은 무리.
  • c++ builder XE4, 10.2 Tokyo > TTimer > N회 재시도

  • 검색 키워드


  • burst mode
  • 빨간 녀석
  • 가속 장치
  • 좋은 웹페이지 즐겨찾기