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
[49332] [질문]시간때문에 급조해서 만든 큔데여.. 쓰레드에서 돌릴시에 이상한 문제가발생해서 질문을 합니다.
zeFa [] 1072 읽음    2007-05-22 15:08
//우선 소스 첨부요 ;
#define MAX_QUE      1000

template <class T> class CDataQue
{
private:
   T              m_aData[MAX_QUE];
   int            m_nIndex;
public:
   CDataQue():m_nIndex(0){ ZeroMemory(m_aData,sizeof(m_aData)); };
   ~CDataQue(){};

   void           __fastcall Add(T value);
   T              __fastcall GetQue();
   void           __fastcall IndexSort();
};//CDataQue

template <class T> void __fastcall CDataQue<T>::Add(T value)
{
   CopyMemory(&m_aData[m_nIndex], &value, sizeof(T));
   _WriteDebug(DEBUG_MAIN,"Add  %d \r\n", m_nIndex);
   m_nIndex ++;
}//Add

template <class T> T __fastcall CDataQue<T>::GetQue()
{
   T data;
   CopyMemory(&data, &m_aData[0], sizeof(T));
   IndexSort();
   return data;
}//GetQue


template <class T> void __fastcall CDataQue<T>::IndexSort()
{
   for(int i=0; i < m_nIndex;i++ )
   {
      CopyMemory(&m_aData[i],&m_aData[i+1],sizeof(T));
   }//for
   _WriteDebug(DEBUG_MAIN,"Get  %d \r\n", m_nIndex);
m_nIndex --;

}//IndexSort  


//32개의 쓰레드에서 이 큐 Class의 Add()메소드를 호출합니다.
그리고 PostMessage로 Main.cpp에 데이터를 보내고..
Main.cpp에서는 Get메소드를 호출하여 데이터를 뽑습니다.
Get에서는 무조건 0번째 배열값만 뽑아내게 되어 있구요.
한번 뽑아냈을경우에는 0번째 배열을 날려주고, 뒤에 배열들을 한칸씩 앞으로 이동시켜줍니다.

달랑 이기능인데..
이상한현상이 발생을 해서 말이죠.
위에소스보시면 WriteDebug()이 함수로 txt파일에 log를 테스트겸해서 찍어보니..
들어갈때. 0,1,2,3,4,5,6, ...
이렇게 정상적으로 들어가는데..
Get함수에서 찍히는걸보면  0,-1,-2,-3,-4,-5  가 찍히네요.. ;

혹시나 해서 m_nIndex 변수형에 unsigned를 붙이면..
Add에서는 정상적으로 수치가 올라가는데..
Get는 그냥 0 만 찍히네여..

그리고 큐를 넣고 쓸적에 다른방법으로도 해보았습니다.
add함수에서
m_nIndex++;
if(m_nIndex > 1000)m_nIndex =0;

InsertSort()에서

m_nIndex --;를 삭제도 해봤는데 다시생각해보니까
다중으로 큐에 데이터 입력시에
이럴경우에 큐 마지막에 에러가 날듯 싶었지만..
결과는 같았습니다.


Add함수는 쓰레드당 1번씩만 호출을 하게 되어 있구요.
Get는 Main한군데에서 1번만 호출하게 되어 있습니다.

이.. 허접한 큐를 만든이유도.. 그냥 PostMessage로 데이터를 날릴경우..
이상한값이 찍혀서 만든건데..  이큐도 잘 작동하다가..
어제 이걸쓰는곳이 아닌 다른곳에 작업하다가 컴파일을하니.. 이런애러가 나더라구요.
그래서 기존 소스를 다시 컴파일했는데도 이런일이. ㅡㅡ;;
컴파일러가 이상한건지...ㅠㅠ

혹시 쓰레드에서 발생한 이런문제에대해 해결해보신분이나..
다른 탐구력이 있으신분들 도와주세요.
집에가고싶어요 ;ㅁ;

+ -

관련 글 리스트
49332 [질문]시간때문에 급조해서 만든 큔데여.. 쓰레드에서 돌릴시에 이상한 문제가발생해서 질문을 합니다. zeFa 1072 2007/05/22
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.