윈도우즈 프로그램 설계(23): 3가지 단일 문서 프로그램의 구조 비교

첫 번째는 우리가 전에 말했던 블록 프로그램인데 그 호출 관계는 대체로 다음과 같다.
두 번째는 간단한 주식시장 소프트웨어의 프로그램이다. 비교적 길기 때문에 여기에 코드를 붙이지 않는다. 대략적인 사고방식을 말하자면 전문적인 하드웨어와 조립된 구동, 동적 링크 라이브러리가 있다.동적 링크 라이브러리의 함수를 통해 주파수에서 수신된 메시지를 윈도우즈의 사용자 정의 메시지와 연결할 수 있으며, 연결된 후에 메시지 응답 함수인 OnIRQ를 통해 정보를 얻을 수 있습니다.GetActiveDocument에서 문서 클래스 포인터를 얻어 문서 클래스의 m 에 데이터를 놓습니다stock 중.그리고 GetActiveView를 통해 클래스 포인터를 가져와 클래스의 Invalidate 함수를 호출합니다. 이 함수는 운영체제에서 WM 을 보냅니다.PAINT 메시지, 이 메시지는 보기 OnPaint 함수를 호출하고 Ondraw 함수를 호출합니다.Ondraw가 그림을 그리려면 GetDocument에서 문서 클래스의 바늘을 가져와 문서의 데이터를 가져와서 그림을 그려야 합니다.아키텍처는 다음과 같습니다.
첫 번째 프로그램과 비교했을 때 가장 큰 차이점은 이 프로그램이 데이터에 대한 보호가 부족하다는 것이다.데이터가 공개되었을 때 인터페이스를 통해 접근하지 않았습니다.그래서 프로그램이 개선되거나 업그레이드가 필요하다면 수정이 필요한 부분이 매우 많다.만약 데이터에 대한 접근이 인터페이스를 제공한다면, 인터페이스가 변하지 않는다면, 인터페이스를 호출하는 함수는 너무 큰 수정을 할 필요가 없다.그리고 인터페이스를 제공했다면 데이터를 움직이려면 인터페이스를 통과해야 데이터가 더욱 안전해진다.다음은 더욱 복잡한 주식시장 소프트웨어 프로그램을 보겠습니다. 이것은 다중 스레드 기술을 사용했고 노선 그림은 약간 특별합니다. 주로 스레드 간의 관계를 강조하는 것이지 유형의 관계가 아닙니다.
우선, 응용 프로그램과 프레임워크 클래스가 전체 프로그램의 주 라인을 구성한다.Oncreate에 두 개의 스레드가 생성되었습니다.하나의 스레드는 CUIframe Wnd와 CUIthread로 구성되어 있는데 이런 스레드는 UI 스레드가 된다. 그들은 창이 있고 메시지를 수신할 수 있다. 우리의 데이터 수신 응답 함수인 OnIRQ는 안에 놓여 있고 다른 스레드인 ReadRingThread는 Worker 스레드로 창이 없어 수거를 읽는 데 사용된다.매번 데이터를 받은 후에 읽기 링 라인을 호출하여 데이터를 읽고 다른 데이터 구조에 저장하여 현재와 역사를 저장하고 표시하는 데 사용한다.읽은 후에 다시 라인을 수면시킨다.이 프로그램의 묘한 점은 OnIRQ와 ReadRingThread 모두 데이터를 조작했지만 스레드 동기화 메커니즘을 사용하여 데이터를 보호하지 않았다는 점이다. 왜 그런가?디자이너가 데이터를 하나의 고리로 설계했기 때문에 데이터를 읽을 때 현재 위치에 쓰기 전의 어느 위치의 데이터만 읽을 수 있다.따라서 읽기 및 쓰기 작업은 항상 같은 메모리 주소를 사용하지 않습니다.여기에 이 주식시장 소프트웨어의 데이터 구조에 관한 몇 마디의 디자인을 보충하는데, 사실은 대학에서 물어본 것이다.접수된 가방은 고정된 형식으로 가방의 유형을 통해 지수인지 주식인지, 정보인지 등을 판단한다.그러나 이런 정보 중 일부는 장기적으로 저장해야 한다. 예를 들어 모든 주식의 매 분의 가격, 거래량 등이다.어떤 정보는 저장할 필요가 없다. 예를 들어 현재 시각의 하나를 사고 둘을 사고 셋을 사는 것과 같은 것이다.그리고 주식시장의 주식 수량은 끊임없이 변화한다.이러한 요소를 고려하여 설계된 데이터 구조는 다음과 같아야 한다.
typedef struct
{
	float	New;
  	float	Amount;
    float   Volume;	
	CTime	Time;
}STORAGE;//------------------------------------------------------------          


typedef struct
{
	float	LastClose;
	float	Highest;
    float   Open;
	float	New;
    float   Lowest;
	float	Volume;
	float	Amount;
	float	Pbuy1;
	float	Vbuy1;
	float	Pbuy2;
	float	Vbuy2;
	float	Pbuy3;
	float	Vbuy3;
	float	Pbuy4;
	float	Vbuy4;
	float	Psell1;
	float	Vsell1;
	float	Psell2;
	float	Vsell2;
	float	Psell3;
	float	Vsell3;
	float	Psell4;
	float	Vsell4;																
}REFRESH;//-------------------------------------------          

class CIndexStockMem/* : public CObject*///-----------               
{
public:
	CIndexStockMem();
	virtual ~CIndexStockMem();

//	void IsCurWindow(CString strCurCode);

	CArray m_StorageArray;//--------             	
	REFRESH m_Refresh;//------------------------------           

};

그렇다면 어떻게 이런 데이터 구조에 접근합니까?어떤 사람은 증권 코드를 통해 접근하고, 어떤 사람은 병음을 통해 접근한 다음에 앞에서 말한 CindexStockMem 종류를 가리키는 지침을 추가해야 한다.
class CIndicator/* : public CObject*///               
{
public:
	CIndicator();
	CIndicator(CIndicator& Indicator);
	virtual ~CIndicator();

	CIndicator& operator = (CIndicator& Indicator);

public:
	CString				m_strIndicatorCode;//        
	CString				m_strIndicatorName;//        
	CIndexStockMem*		m_pIndexStockMem;//            	
};

원본 프로그램에서 버퍼와 저장하고 새로 고칠 데이터를 CUIframe Wnd 아래에 놓고 원본 문서 보기 구조를 비웠다.이런 디자인은 사실 결코 매우 합리적인 것이 아니다.저장하고 새로 고친 데이터의 데이터를 문서에 두는 것이 더욱 적합하다.

좋은 웹페이지 즐겨찾기