C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[50406] Re:Re:Re:[재질문]어디에 문제가 있는지는 알았습니다. 그런데...
왕초보빌더 [coppermilk] 1745 읽음    2007-08-29 06:21
제가 패널을 상속 받아서 패널 위에 차트와 스피드 버튼이 있는 컴포넌트를 만들었습니다.
그래서 그 컴포넌트에서 스피드 버튼의 클릭 이벤트를 잡아서 사용하려고 하는데 그게
잘 안되는 것이었습니다.
메인폼위에 있는 다른 컴포넌트들은 다 잘되고 있더군요... ㅡ.ㅡ

다음은 제가 작성한 컴포넌트의 일부입니다.
어디가 문제인지를 모르겠습니다... ㅡ.ㅡ

고수님들의 조언 기다리겠습니다...

//-----------------------------------------------------------------------------------------------
//   헤더
//-----------------------------------------------------------------------------------------------
class PACKAGE TNSRIPanelChart : public TPanel
{
protected:
//---------------------------------------------------------------------------
//    차트의 프로텍티드 이벤트 오버로딩 (차트가 다시 그려질때 수행)
//---------------------------------------------------------------------------
//    virtual void __fastcall Paint();
//        virtual void __fastcall Resize(TObject *Sender);
//        DYNAMIC void __fastcall Resize(void);
private:
//---------------------------------------------------------------------------
//
//---------------------------------------------------------------------------
        MESSAGE void __fastcall NSRIPanelChartReSize(TMessage &Message);
        MESSAGE void __fastcall NSRIPanelChartPaint(TMessage &Message);
        BEGIN_MESSAGE_MAP
           MESSAGE_HANDLER(WM_SIZE, TMessage, NSRIPanelChartReSize);
        END_MESSAGE_MAP(TPanel)
//---------------------------------------------------------------------------
//    스피드 버튼 이벤트 처리
//---------------------------------------------------------------------------
        TNotifyEvent __fastcall GetOnDataSourceBtnClick();
        void __fastcall SetOnDataSourceBtnClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOnRangeBtnClick();
        void __fastcall SetOnRangeBtnClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOndBmYMaxBtnClick();
        void __fastcall SetOndBmYMaxBtnClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOnGraphFormatBtnClick();
        void __fastcall SetOnGraphFormatBtnClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOndBmYMinBtnClick();
        void __fastcall SetOndBmYMinBtnClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOnCenterFrequencyBtnClick();
        void __fastcall SetOnCenterFrequencyBtnClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOnRBWBtnClick();
        void __fastcall SetOnRBWBtnClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOnSpanBtnClick();
        void __fastcall SetOnSpanBtnClick(TNotifyEvent Value);
//---------------------------------------------------------------------------
//    팝업 메뉴 클릭 이벤트 처리
//---------------------------------------------------------------------------
        TNotifyEvent __fastcall GetOnY_Auto_ScaleClick();
        void __fastcall SetOnY_Auto_ScaleClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOnShow_MakerClick();
        void __fastcall SetOnShow_MakerClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOnShow_OffsetClick();
        void __fastcall SetOnShow_OffsetClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOnShow_Band_MakerClick();
        void __fastcall SetOnShow_Band_MakerClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOnShow_Sub_SignalClick();
        void __fastcall SetOnShow_Sub_SignalClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOnCopy_Maker_to_Center_FreqClick();
        void __fastcall SetOnCopy_Maker_to_Center_FreqClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOnCopy_Maker_to_Ymax_LevelClick();
        void __fastcall SetOnCopy_Maker_to_Ymax_LevelClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOnMove_Offset_to_MakerClick();
        void __fastcall SetOnMove_Offset_to_MakerClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOnSelect_Window_TypeClick();
        void __fastcall SetOnSelect_Window_TypeClick(TNotifyEvent Value);

        TNotifyEvent __fastcall GetOnSelect_Freq_Point_NumClick();
        void __fastcall SetOnSelect_Freq_Point_NumClick(TNotifyEvent Value);
public:
//-----------------------------------------------------------------------------
//  스피드 버튼과 라벨 선언
//-----------------------------------------------------------------------------
        TSpeedButton *DataSourceBtn;
        TLabel *MessageLabel;
        TSpeedButton *RangeBtn;
        TSpeedButton *dBmYMaxBtn;
        TSpeedButton *GraphFormatBtn;
        TSpeedButton *dBmYMinBtn;
        TSpeedButton *CenterFrequencyBtn;
        TSpeedButton *RBWBtn;
        TSpeedButton *SpanBtn;
        TLabel *SwpTimeLabel;
        TPanel *TopPanel;
        TPanel *LeftPanel;
        TPanel *BottomPanel;
        TChart *NSRI_Chart;
//-----------------------------------------------------------------------------
//   차트의 시리즈 선언
//-----------------------------------------------------------------------------
        TFastLineSeries *Signal;
        TPointSeries *Marker;
        TFastLineSeries *Sub_Signal;
//-----------------------------------------------------------------------------
//   팝업 메뉴와 아이템 선언
//-----------------------------------------------------------------------------
        TPopupMenu *pPopupMenu;
        TMenuItem *Item1;
        TMenuItem *Item2;
        TMenuItem *Item3;
        TMenuItem *Item4;
        TMenuItem *Item5;
        TMenuItem *Item6;
        TMenuItem *Item7;
        TMenuItem *Item8;
        TMenuItem *Item9;
        TMenuItem *Item10;
        TMenuItem *Item11;
        TMenuItem *Item12;
        TMenuItem *Item13;
//-----------------------------------------------------------------------------
//    컴포넌트 생성자와 소멸자
//-----------------------------------------------------------------------------
        __fastcall TNSRIPanelChart(TComponent* Owner);
        __fastcall ~TNSRIPanelChart();

__published:
//-----------------------------------------------------------------------------
//    스피드 버튼의 이벤트 선언
//-----------------------------------------------------------------------------
        __property TNotifyEvent OnDataSourceBtnClick = {read = GetOnDataSourceBtnClick, write = SetOnDataSourceBtnClick };
        __property TNotifyEvent OnRangeBtnClick = {read = GetOnRangeBtnClick, write = SetOnRangeBtnClick };
        __property TNotifyEvent OndBmYMaxBtnClick = {read = GetOndBmYMaxBtnClick, write = SetOndBmYMaxBtnClick };
        __property TNotifyEvent OnGraphFormatBtnClick = {read = GetOnGraphFormatBtnClick, write = SetOnGraphFormatBtnClick };
        __property TNotifyEvent OndBmYMinBtnClick = {read = GetOndBmYMinBtnClick, write = SetOndBmYMinBtnClick };
        __property TNotifyEvent OnCenterFrequencyBtnClick = {read = GetOnCenterFrequencyBtnClick, write = SetOnCenterFrequencyBtnClick };
        __property TNotifyEvent OnRBWBtnClick = {read = GetOnRBWBtnClick, write = SetOnRBWBtnClick };
        __property TNotifyEvent OnSpanBtnClick = {read = GetOnSpanBtnClick, write = SetOnSpanBtnClick };
//-----------------------------------------------------------------------------
//    팝업 메뉴의 클릭 이벤트 선언
//-----------------------------------------------------------------------------
        __property TNotifyEvent OnY_Auto_ScaleClick = {read = GetOnY_Auto_ScaleClick, write = SetOnY_Auto_ScaleClick };
        __property TNotifyEvent OnShow_MakerClick = {read = GetOnShow_MakerClick, write = SetOnShow_MakerClick };
        __property TNotifyEvent OnShow_OffsetClick = {read = GetOnShow_OffsetClick, write = SetOnShow_OffsetClick };
        __property TNotifyEvent OnShow_Band_MakerClick = {read = GetOnShow_Band_MakerClick, write = SetOnShow_Band_MakerClick };
        __property TNotifyEvent OnShow_Sub_SignalClick = {read = GetOnShow_Sub_SignalClick, write = SetOnShow_Sub_SignalClick };
        __property TNotifyEvent OnCopy_Maker_to_Center_FreqClick = {read = GetOnCopy_Maker_to_Center_FreqClick, write = SetOnCopy_Maker_to_Center_FreqClick };
        __property TNotifyEvent OnCopy_Maker_to_Ymax_LevelClick = {read = GetOnCopy_Maker_to_Ymax_LevelClick, write = SetOnCopy_Maker_to_Ymax_LevelClick };
        __property TNotifyEvent OnMove_Offset_to_MakerClick = {read = GetOnMove_Offset_to_MakerClick, write = SetOnMove_Offset_to_MakerClick };
        __property TNotifyEvent OnSelect_Window_TypeClick = {read = GetOnSelect_Window_TypeClick, write = SetOnSelect_Window_TypeClick };
        __property TNotifyEvent OnSelect_Freq_Point_NumClick = {read = GetOnSelect_Freq_Point_NumClick, write = SetOnSelect_Freq_Point_NumClick };
};
//-----------------------------------------------------------------------------------------------
//   소스중 이벤트 처리하는 일부분
//-----------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 차트 안에 있는 스피드 버튼의 이벤트 처리
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnDataSourceBtnClick()
{
   return DataSourceBtn->OnClick;
}

void __fastcall TNSRIPanelChart::SetOnDataSourceBtnClick(TNotifyEvent Value)
{
   DataSourceBtn->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnRangeBtnClick()
{
   return RangeBtn->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnRangeBtnClick(TNotifyEvent Value)
{
   RangeBtn->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOndBmYMaxBtnClick()
{
   return dBmYMaxBtn->OnClick;
}
void __fastcall TNSRIPanelChart::SetOndBmYMaxBtnClick(TNotifyEvent Value)
{
   dBmYMaxBtn->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnGraphFormatBtnClick()
{
   return GraphFormatBtn->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnGraphFormatBtnClick(TNotifyEvent Value)
{
   GraphFormatBtn->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOndBmYMinBtnClick()
{
   return dBmYMinBtn->OnClick;
}
void __fastcall TNSRIPanelChart::SetOndBmYMinBtnClick(TNotifyEvent Value)
{
   dBmYMinBtn->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnCenterFrequencyBtnClick()
{
   return CenterFrequencyBtn->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnCenterFrequencyBtnClick(TNotifyEvent Value)
{
   CenterFrequencyBtn->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnRBWBtnClick()
{
   return RBWBtn->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnRBWBtnClick(TNotifyEvent Value)
{
   RBWBtn->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnSpanBtnClick()
{
   return SpanBtn->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnSpanBtnClick(TNotifyEvent Value)
{
   SpanBtn->OnClick = Value;
}
//---------------------------------------------------------------------------
//    팝업 메뉴 클릭 이벤트 처리
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnY_Auto_ScaleClick()
{
   return Item1->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnY_Auto_ScaleClick(TNotifyEvent Value)
{
   Item1->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnShow_MakerClick()
{
   return Item3->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnShow_MakerClick(TNotifyEvent Value)
{
   Item3->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnShow_OffsetClick()
{
   return Item4->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnShow_OffsetClick(TNotifyEvent Value)
{
   Item4->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnShow_Band_MakerClick()
{
   return Item5->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnShow_Band_MakerClick(TNotifyEvent Value)
{
   Item5->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnShow_Sub_SignalClick()
{
   return Item6->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnShow_Sub_SignalClick(TNotifyEvent Value)
{
   Item6->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnCopy_Maker_to_Center_FreqClick()
{
   return Item8->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnCopy_Maker_to_Center_FreqClick(TNotifyEvent Value)
{
   Item8->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnCopy_Maker_to_Ymax_LevelClick()
{
   return Item9->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnCopy_Maker_to_Ymax_LevelClick(TNotifyEvent Value)
{
   Item9->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnMove_Offset_to_MakerClick()
{
   return Item10->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnMove_Offset_to_MakerClick(TNotifyEvent Value)
{
   Item10->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnSelect_Window_TypeClick()
{
   return Item12->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnSelect_Window_TypeClick(TNotifyEvent Value)
{
   Item12->OnClick = Value;
}
//---------------------------------------------------------------------------
TNotifyEvent __fastcall TNSRIPanelChart::GetOnSelect_Freq_Point_NumClick()
{
   return Item13->OnClick;
}
void __fastcall TNSRIPanelChart::SetOnSelect_Freq_Point_NumClick(TNotifyEvent Value)
{
   Item13->OnClick = Value;
}
//---------------------------------------------------------------------------
namespace Nsripanelchart
{
        void __fastcall PACKAGE Register()
        {
                 TComponentClass classes[1] = {__classid(TNSRIPanelChart)};
                 RegisterComponents("Standard", classes, 0);
        }
}

//-----------------------------------------------------------------------------------------------

왕초보빌더 님이 쓰신 글 :
: 먼저 답변에 감사드립니다...
:
: 데이터를 실시간으로 그려야 합니다.
: 한번에 가져오는 데이터는 약 1600 ~ 32000개 정도 됩니다.
: 그 데이터를 실시간으로 그려야 해서 그리는 쓰레드에서는 그리는 작업만 하도록 했습니다.
: 두개의 쓰레드에서는 다른 작업은 거의 하지 않습니다.
: 1. 데이터를 읽는 쓰레드
:     데이터를 받아오기만 합니다.
:     배열로 받아서 버퍼에 쌓아둡니다.
: 2. 데이터를 차트에 그리는 쓰레드
:     받아온 데이터를 단순히 그려줍니다.
:     버퍼에 쌓여있는 데이터를 그리기만 합니다.
:
: 위와 같은 작업만 하는데... 이상하게도 차트가 있는 메인폼의 버튼을 클릭해도 동작이 되지를 않습니다.
: 따로 232로 메시지를 받아서 처리하는 루틴이 있기는 하지만... 그게 큰 영향을 미치는 것 같지는 않습니다.
:
: 그리고 메인 쓰레드는 어떤 쓰레드를 말씀하시는 건가요???
: application 을 말씀하시는 건가요??? 아니면 1번 데이터를 읽는 쓰레드를 말씀하시는 건가요???
:
: 제안에 대한 질문
: [제안 1]실시간으로 데이터를 그려야하기 때문에 데이터를 받아오는 쓰레드와 그리는 쓰레드를
: 각각 두었습니다. 데이터를 받아오는데 시간이 걸리기 때문입니다.
: 그리는 쓰레드에서 Series->AddXY() 하면서 한번씩 Application->ProcessMessage() 해줘도
: 별로 효과가 없습니다.
: [제안 2] 메인쓰레드와 Syncronize ==> 여기서 메인 쓰레드는 데이터를 읽어오는 쓰레드를 말씀하시는 건가요???
:
:
:
:
: 장성호 님이 쓰신 글 :
: : TChart가 왠만큼 데이타 많이서는 버벅거리지 않는걸로 알고있습니다만.....
: :
: : [질문]
: : 얼마나 많은 양의 데이타를, 얼마나 자주 가져와서, 얼마나 자주 TChart에 갱신해 주는지요?
: :
: : 질문의 내용만으로는 로직이 어떻게 돌아가는지 잘 이해가 되지않아
: : 이렇게해보세요 라고 구체적으로 얘기하는 힘드네요
: :
: : 그래도 한두가지 제안해보면..
: :
: : [제안1]
: : 두번째 쓰레드에서 하는 작업을 그냥 메인쓰레드에서 하면 안되나요
: : 그리고 Series->Add()하면서 중간에
: : Application->ProcessMessage()  해주시면 그런 문제 없어질것 같은데요
: : 메인쓰레드에서 할경우 위와같이 해주면 데이타가 아무리 많아도 문제없죠
: :
: : [제안2]
: : 그냥 두번째 쓰레드를 2번방법으로 해두고
: : 메인쓰레드와 Syncronize 하시면 될듯도...
: :
: : 방법3은 안되구요  , Sleep한만큼 손해봅니다.
: :
: : 방법1이 통하는 이유는?
: : 두번째 쓰레드가 멈춘후에 메인쓰레드 TChart의 화면갱신이 일어나기땜시....
: : 되는것 같은데.... 권하고 싶은 방법은 아니네요
: :
: :
: : 2번방법으로 하되 TChart에 그리는것을 메인쓰레드에서 하는
: : 제안1을 권합니다.
: : 제생각엔 그 방법이 제어도 편하고 , 속도도 빠를것 같습니다.
: :
: : 그럼....
: :
: :
: : 왕초보빌더 님이 쓰신 글 :
: : : 프로그램이 시작되면 쓰레드를 두개 만듭니다.
: : : 첫번째 쓰레드 : 데이터를 읽어오는 쓰레드
: : : 두번째 쓰레드 : 데이터를 TChart에 그리는 쓰레드
: : : 많은 양의 데이터를 읽어와서 빠른 속도로 그래프로 출력해야 해서 위 처럼 두개의 쓰레드를 사용했습니다.
: : : 그리고, 둘 간에 동기화는 하지 않았습니다.
: : : 데이터를 읽어와서 TChart에 그리는데 까지는 전혀 문제가 없습니다.
: : :
: : : 그런데, TChart 가 CPU 를 너무 잡아서 그런지...
: : : TChart가 메인 폼에 있는데... 메인폼에 있는 버튼들이 잘 동작하지 않습니다.
: : : 마우스를 스무번 이상 클릭해야 한번 정도 동작하는 것 같습니다.
: : :
: : : 해결책이 없을까요?
: : : 고수님 들의 답변 기대합니다... 도와주십셔... ㅜ.ㅜ
: : :
: : : 참... 그리고  TChart 7 Pro 버전에서는 위와 같은 문제가 생기지 않을까요?
: : : 도저히 방법이 없다면 구입을 해서라도 해결해야 해서리...
: : :
: : : 그리고 다음은 제가 시도해본 방법입니다.
: : : 1. 데이터를 받아오는 쓰레드에서 메시지를 날려서 그래프를 그리는 쓰레드를 resume 과 suspend 를 반복하게
: : : 해줘봤습니다.
: : : 효과를 약간 보기는 했지만, delete 쓰레드를 했을때 쓰레드가 죽지 않는 문제가 발생합니다.
: : :
: : : 2. 그래프를 그리는 쓰레드 안에서 루프를 돌면서 주기적으로 Application->ProcessMessage() 를 해줘봤습니다.
: : : 그러나, 별로 효과가 없었습니다.
: : :
: : : 3. 그래프를 그리는 쓰레드 내부에서 일정 량을 그린후 Sleep(100)을 줘봤습니다.
: : : 위의 1번과 비슷한 효과를 얻었습니다.
: : :
: : : 제가 시도해본 방법으로 약간의 효과를 얻을 수는 있었지만, 만족할 만한 수준은 아니었습니다.

+ -

관련 글 리스트
50402 [질문]TChart 관련... 도움 부탁드립니다.... ㅜ.ㅜ 왕초보빌더 1886 2007/08/29
50403     Re:[질문]TChart 관련... 도움 부탁드립니다.... ㅜ.ㅜ 장성호 1917 2007/08/29
50404         Re:Re:[재질문]실시간으로 그려야해서... 왕초보빌더 1901 2007/08/29
50406             Re:Re:Re:[재질문]어디에 문제가 있는지는 알았습니다. 그런데... 왕초보빌더 1745 2007/08/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.