C++ Builder XE4, 10.2 Tokyo > Form1: 항목 추가 + Form2: 추가 항목 검색 > TStringList 구현

운영 환경
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)

처리


  • 장치 등에서 데이터가 적절히 추가됨
  • 예 : 200msec 당 하나씩

  • 데이터를 적절한 개수로 검색
  • 예 : 초당 5 개


  • 양식 구성


  • Form1이 데이터 추가
  • Form2가 데이터 검색

  • code



    Unit1.cpp
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        Timer1->Enabled = false;
        Timer1->Interval = 200; // msec
        Timer1->Enabled = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
        static int idx = 0;
    
        Form2->AddItem(IntToStr(idx));
        idx++;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormShow(TObject *Sender)
    {
        Form2->Show();
    }
    //---------------------------------------------------------------------------
    

    Unit2.cpp
    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm2 *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
    {
        m_itemList = new TStringList();
    
        Timer1->Enabled = false;
        Timer1->Interval = 1000; // msec
        Timer1->Enabled = true;
    }
    __fastcall TForm2::~TForm2()
    {
        delete m_itemList;
        m_itemList = NULL;
    }
    
    void __fastcall TForm2::AddItem(String item)
    {
        m_itemList->Add(item);
    }
    //---------------------------------------------------------------------------
    
    static const int kNumExtract = 5; // 取出す項目数
    
    void __fastcall TForm2::Timer1Timer(TObject *Sender)
    {
        if (m_itemList->Count < kNumExtract) {
            return;
        }
    
        // TODO:資源のロック開始
    
        String item = L"";
        for(int idx=0; idx < kNumExtract; idx++) {
            item = item + L"," + m_itemList->Strings[idx];
        }
        for(int loop=0; loop < kNumExtract; loop++) {
            m_itemList->Delete(0);
        }
    
        // TODO:資源のロック解除
    
        String msg = item + L" @ " + Now().FormatString(L"yyyy/mm/dd hh:nn:ss.zzz");
    
        Memo1->Lines->Add(msg);
    
    }
    //---------------------------------------------------------------------------
    

    결과



    5개의 항목 표시가 1014msec마다 실시되고 있다.



    자원 잠금



    Form2의 Timer 처리중에 Form1로부터 AddItem()은 문제 없을까.

    Mutex나 CriticalSection등을 검토하고 있었지만, 아래의 조사에서는 기대한 것 같은 락 동작은 되지 않았다.
    htps : // m / 7, f9 / ms / e b3, 7f2bd19, 892c2b20

    비고



    폼이 아닌 TThread로 구현하면, thread의 우선도를 설정할 수 있다.
    다만, TThread로 실장해도 락이 걸리는 타이밍은 기대한 것이 아니었다.

    좋은 웹페이지 즐겨찾기