#9
by キョウ太郎 » 5年前
Mathさん
ご連絡ありがとうございます。
下記のコードはC++Builderのスレッドオブジェクトを追加してThread.cppに記載してます。
メイン処理からデータ取得のタスクを動かした後に「MyThread::Execute()」を実行して
MainFrm内に配置したTImageに対してメイン画面のStopボタンが押されるまで描画しています。
※ 最大8chまで描画可能の予定ですが現在テスト段階なので2chまでしか表示しないようにしています。
罫線などはメイン側に記載のDrawingArea();で描画させています。
実際の描画画面も見て頂きたかったのですが、
画像ギャラリーのエラーで画像取り込めないので、とりあえずコードのみ記載します。
お手数ですがご確認をよろしくお願い致します。
コード:
// マルチスレッド中の描画処理
void __fastcall MyThread::UpdateDrawing()
{
Application->ProcessMessages();
// 描画領域のY軸幅を計算
haba = DrawHeightY2 / 20;
haba = haba *10; //小数点切り捨てられてるので戻さないと罫線とずれる
// MainFrame->TImgBG->Canvas->Pen->Color = clRed;
Ypoint0 = (DrawHeightY + haba);
Xpoint0 = DrawLeftX;
x = 0;
haba = DrawLeftX2 - DrawLeftX;
// 描画領域のX軸幅を計算
ms = haba / 10000;
// ten = 0;
// データ取得
// 共有メモリ(メモリマップトファイル)を開く
HANDLE hMapping = OpenFileMapping(FILE_MAP_READ, FALSE, L"NI-Data_test");
if ( hMapping == NULL ) {
ShowMessage("共有メモリが見つかりません");
return;
}
// マッピング開始
char *dat = (char *)MapViewOfFile(hMapping,
FILE_MAP_READ, // 読込モード
0,
0,
0); // 上限まで読込
if ( dat == NULL ) {
ShowMessage("共有メモリのデータがありません");
return;
}
// データ読込
AnsiString ebuff = AnsiString(dat);
// マッピング解除
UnmapViewOfFile(dat);
//int cnt = 1;
//int gou2 = 1000 * Tspan;
int gou2 = 1000 * MainFrame->Tspan * MainFrame->pages;
//gou = 0;
//カンマ区切りの文字列
//結果格納用のTStringListを用意
TStringList* splittedResult = new TStringList();
//CommaTextプロパティにセット
splittedResult->CommaText = ebuff;
for(int i= DataCnt; i < splittedResult->Count-1; i++)
{
switch(chCnt)
{
case 1:
x2 = x2 + ms;
// ten1_1 = (array[DataCnt].ToDouble() * -10.0 ) * MainFrame->correctValue;
ten1_1 = (splittedResult->Strings[DataCnt].ToDouble() * -10.0 ) * MainFrame->correctValue;
MainFrame->TImgBG->Canvas->Pen->Color = clRed;
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten1 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten1 * MainFrame->V_valueUP));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten1_1 * MainFrame->V_valueUP));
chCnt = 2;
ten1 = ten1_1;
break;
case 2:
// ten2_1 = (array[DataCnt].ToDouble() * -10.0 ) * MainFrame->correctValue;
ten2_1 = (splittedResult->Strings[DataCnt].ToDouble() * -10.0 ) * MainFrame->correctValue;
MainFrame->TImgBG->Canvas->Pen->Color = TColor("$001763FF");
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten2 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten2 * MainFrame->V_valueUP));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten2_1 * MainFrame->V_valueUP));
chCnt = 1;
ten2 = ten2_1;
gou = gou + ms;
//x = x2*(10.0/Tspan);
X_time = x2*(10.0/MainFrame->Tspan);
// 右端まで行ったら次ページとして先頭にカーソルを戻す。
if ((MainFrame->TImgBG->Width) < gou * (10 / MainFrame->Tspan) )
{
Sleep(50);
MainFrame->pages = MainFrame->pages + 1;
gou = 0;
X_time = 1;
x2 = 1;
// 縦横の罫線を再描画する。
MainFrame->TImgBG->Picture = NULL;
MainFrame->DrawingArea();
}
break;
case 3:
// ten3_1 = array[DataCnt].ToDouble() * -10.0 ;
MainFrame->TImgBG->Canvas->Pen->Color = TColor("$$00800040");;
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten3 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten3 * MainFrame->Vspan));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten3_1 * MainFrame->Vspan));
chCnt = 4;
ten3 = ten3_1;
break;
case 4:
// ten4_1 = array[DataCnt].ToDouble() * -10.0 ;
MainFrame->TImgBG->Canvas->Pen->Color = TColor("$clBlue");;
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten4 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten4 * MainFrame->Vspan));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten4_1 * MainFrame->Vspan));
chCnt = 5;
ten4 = ten4_1;
break;
case 5:
// ten5_1 = array[DataCnt].ToDouble() * -10.0 ;
MainFrame->TImgBG->Canvas->Pen->Color = TColor("$$00FF8000");;
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten5 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten5 * MainFrame->Vspan));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten5_1 * MainFrame->Vspan));
chCnt = 6;
ten5 = ten5_1;
break;
case 6:
// ten6_1 = array[DataCnt].ToDouble() * -10.0 ;
MainFrame->TImgBG->Canvas->Pen->Color = TColor("$$00408000");;
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten6 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten6 * MainFrame->Vspan));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten6_1 * MainFrame->Vspan));
chCnt = 7;
ten6 = ten6_1;
break;
case 7:
// ten7_1 = array[DataCnt].ToDouble() * -10.0 ;
MainFrame->TImgBG->Canvas->Pen->Color = TColor("$$0040FF00");;
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten7 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten7 * MainFrame->Vspan));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten7_1 * MainFrame->Vspan));
chCnt = 8;
ten7 = ten7_1;
break;
case 8:
// ten8_1 = array[DataCnt].ToDouble() * -10.0 ;
MainFrame->TImgBG->Canvas->Pen->Color = TColor("$clOlive");;
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten8 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten8 * MainFrame->Vspan));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten8_1 * MainFrame->Vspan));
chCnt = 1;
ten8 = ten8_1;
gou = gou + ms;
//x = x2*(10.0/Tspan);
X_time = x2*(10.0/MainFrame->Tspan);
break;
default:
chCnt = 1;
break;
}
if((i % 10) == 0)
{
MainFrame->TImgBG->Update();
MainFrame->TImgWave->Left = Xpoint0 + x2*(10.0/MainFrame->Tspan);
MainFrame->TImgWave->Update();
if (Terminated)
break;
}
DataCnt += 1;
if (Terminated)
break;
}
}
//---------------------------------------------------------------------------
void __fastcall MyThread::Execute()
{
gou;
haba; // 描画領域のXY幅
DrawLeftX = 0; // 描画領域左端
DrawLeftX2 = MainFrame->TImgBG->Width; // 描画領域右端
DrawHeightY = 0; // 描画領域上端
DrawHeightY2 = MainFrame->TImgBG->Height; // 描画領域下端
Ypoint0;
Xpoint0;
//---- ここにスレッド コードを記述します ----
while(1)
{
// VCLコンポーネントに対する操作は、Synchronize() メソッド経由で行わなければならない。
Synchronize(&UpdateDrawing);
// Queue(&UpdateDrawing);
// Sleep(10);
if (Terminated)
break;
// return;
}
}
Mathさん
ご連絡ありがとうございます。
下記のコードはC++Builderのスレッドオブジェクトを追加してThread.cppに記載してます。
メイン処理からデータ取得のタスクを動かした後に「MyThread::Execute()」を実行して
MainFrm内に配置したTImageに対してメイン画面のStopボタンが押されるまで描画しています。
※ 最大8chまで描画可能の予定ですが現在テスト段階なので2chまでしか表示しないようにしています。
罫線などはメイン側に記載のDrawingArea();で描画させています。
実際の描画画面も見て頂きたかったのですが、
画像ギャラリーのエラーで画像取り込めないので、とりあえずコードのみ記載します。
お手数ですがご確認をよろしくお願い致します。
[code]
// マルチスレッド中の描画処理
void __fastcall MyThread::UpdateDrawing()
{
Application->ProcessMessages();
// 描画領域のY軸幅を計算
haba = DrawHeightY2 / 20;
haba = haba *10; //小数点切り捨てられてるので戻さないと罫線とずれる
// MainFrame->TImgBG->Canvas->Pen->Color = clRed;
Ypoint0 = (DrawHeightY + haba);
Xpoint0 = DrawLeftX;
x = 0;
haba = DrawLeftX2 - DrawLeftX;
// 描画領域のX軸幅を計算
ms = haba / 10000;
// ten = 0;
// データ取得
// 共有メモリ(メモリマップトファイル)を開く
HANDLE hMapping = OpenFileMapping(FILE_MAP_READ, FALSE, L"NI-Data_test");
if ( hMapping == NULL ) {
ShowMessage("共有メモリが見つかりません");
return;
}
// マッピング開始
char *dat = (char *)MapViewOfFile(hMapping,
FILE_MAP_READ, // 読込モード
0,
0,
0); // 上限まで読込
if ( dat == NULL ) {
ShowMessage("共有メモリのデータがありません");
return;
}
// データ読込
AnsiString ebuff = AnsiString(dat);
// マッピング解除
UnmapViewOfFile(dat);
//int cnt = 1;
//int gou2 = 1000 * Tspan;
int gou2 = 1000 * MainFrame->Tspan * MainFrame->pages;
//gou = 0;
//カンマ区切りの文字列
//結果格納用のTStringListを用意
TStringList* splittedResult = new TStringList();
//CommaTextプロパティにセット
splittedResult->CommaText = ebuff;
for(int i= DataCnt; i < splittedResult->Count-1; i++)
{
switch(chCnt)
{
case 1:
x2 = x2 + ms;
// ten1_1 = (array[DataCnt].ToDouble() * -10.0 ) * MainFrame->correctValue;
ten1_1 = (splittedResult->Strings[DataCnt].ToDouble() * -10.0 ) * MainFrame->correctValue;
MainFrame->TImgBG->Canvas->Pen->Color = clRed;
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten1 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten1 * MainFrame->V_valueUP));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten1_1 * MainFrame->V_valueUP));
chCnt = 2;
ten1 = ten1_1;
break;
case 2:
// ten2_1 = (array[DataCnt].ToDouble() * -10.0 ) * MainFrame->correctValue;
ten2_1 = (splittedResult->Strings[DataCnt].ToDouble() * -10.0 ) * MainFrame->correctValue;
MainFrame->TImgBG->Canvas->Pen->Color = TColor("$001763FF");
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten2 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten2 * MainFrame->V_valueUP));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten2_1 * MainFrame->V_valueUP));
chCnt = 1;
ten2 = ten2_1;
gou = gou + ms;
//x = x2*(10.0/Tspan);
X_time = x2*(10.0/MainFrame->Tspan);
// 右端まで行ったら次ページとして先頭にカーソルを戻す。
if ((MainFrame->TImgBG->Width) < gou * (10 / MainFrame->Tspan) )
{
Sleep(50);
MainFrame->pages = MainFrame->pages + 1;
gou = 0;
X_time = 1;
x2 = 1;
// 縦横の罫線を再描画する。
MainFrame->TImgBG->Picture = NULL;
MainFrame->DrawingArea();
}
break;
case 3:
// ten3_1 = array[DataCnt].ToDouble() * -10.0 ;
MainFrame->TImgBG->Canvas->Pen->Color = TColor("$$00800040");;
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten3 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten3 * MainFrame->Vspan));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten3_1 * MainFrame->Vspan));
chCnt = 4;
ten3 = ten3_1;
break;
case 4:
// ten4_1 = array[DataCnt].ToDouble() * -10.0 ;
MainFrame->TImgBG->Canvas->Pen->Color = TColor("$clBlue");;
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten4 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten4 * MainFrame->Vspan));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten4_1 * MainFrame->Vspan));
chCnt = 5;
ten4 = ten4_1;
break;
case 5:
// ten5_1 = array[DataCnt].ToDouble() * -10.0 ;
MainFrame->TImgBG->Canvas->Pen->Color = TColor("$$00FF8000");;
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten5 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten5 * MainFrame->Vspan));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten5_1 * MainFrame->Vspan));
chCnt = 6;
ten5 = ten5_1;
break;
case 6:
// ten6_1 = array[DataCnt].ToDouble() * -10.0 ;
MainFrame->TImgBG->Canvas->Pen->Color = TColor("$$00408000");;
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten6 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten6 * MainFrame->Vspan));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten6_1 * MainFrame->Vspan));
chCnt = 7;
ten6 = ten6_1;
break;
case 7:
// ten7_1 = array[DataCnt].ToDouble() * -10.0 ;
MainFrame->TImgBG->Canvas->Pen->Color = TColor("$$0040FF00");;
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten7 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten7 * MainFrame->Vspan));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten7_1 * MainFrame->Vspan));
chCnt = 8;
ten7 = ten7_1;
break;
case 8:
// ten8_1 = array[DataCnt].ToDouble() * -10.0 ;
MainFrame->TImgBG->Canvas->Pen->Color = TColor("$clOlive");;
// TImgBG->Canvas->MoveTo(Xpoint0 + x, Ypoint0 + (ten8 * Vspan));
MainFrame->TImgBG->Canvas->MoveTo(Xpoint0 + X_time, Ypoint0 + (ten8 * MainFrame->Vspan));
MainFrame->TImgBG->Canvas->LineTo(Xpoint0 + x2*(10.0/MainFrame->Tspan), Ypoint0 + (ten8_1 * MainFrame->Vspan));
chCnt = 1;
ten8 = ten8_1;
gou = gou + ms;
//x = x2*(10.0/Tspan);
X_time = x2*(10.0/MainFrame->Tspan);
break;
default:
chCnt = 1;
break;
}
if((i % 10) == 0)
{
MainFrame->TImgBG->Update();
MainFrame->TImgWave->Left = Xpoint0 + x2*(10.0/MainFrame->Tspan);
MainFrame->TImgWave->Update();
if (Terminated)
break;
}
DataCnt += 1;
if (Terminated)
break;
}
}
//---------------------------------------------------------------------------
void __fastcall MyThread::Execute()
{
gou;
haba; // 描画領域のXY幅
DrawLeftX = 0; // 描画領域左端
DrawLeftX2 = MainFrame->TImgBG->Width; // 描画領域右端
DrawHeightY = 0; // 描画領域上端
DrawHeightY2 = MainFrame->TImgBG->Height; // 描画領域下端
Ypoint0;
Xpoint0;
//---- ここにスレッド コードを記述します ----
while(1)
{
// VCLコンポーネントに対する操作は、Synchronize() メソッド経由で行わなければならない。
Synchronize(&UpdateDrawing);
// Queue(&UpdateDrawing);
// Sleep(10);
if (Terminated)
break;
// return;
}
}
[/code]