動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
処理
- 装置などからデータが適宜追加される
- 例: 200msecごとに1個ずつ
- データを適当な個数で取出し
- 例: 1秒ごとに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などを検討していたが、下記の調査では期待したようなロック動作にはならなかった。
https://qiita.com/7of9/items/eb3a7f2bd19e892c2b20
備考
フォームでなくTThreadで実装すると、スレッドの優先度を設定できる。
ただし、TThreadで実装してもロックのかかるタイミングは期待したものではなかった。