|
//우선 소스 첨부요 ;
#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로 데이터를 날릴경우..
이상한값이 찍혀서 만든건데.. 이큐도 잘 작동하다가..
어제 이걸쓰는곳이 아닌 다른곳에 작업하다가 컴파일을하니.. 이런애러가 나더라구요.
그래서 기존 소스를 다시 컴파일했는데도 이런일이. ㅡㅡ;;
컴파일러가 이상한건지...ㅠㅠ
혹시 쓰레드에서 발생한 이런문제에대해 해결해보신분이나..
다른 탐구력이 있으신분들 도와주세요.
집에가고싶어요 ;ㅁ;
|