|
님이 쓰신 글 :
: 피니아 님이 쓰신 글 :
: : 김용덕 님이 쓰신 글 :
: : : 피니아 님이 쓰신 글 :
: : : : c++ 빌더 6에서 thread을 사용하여 실시간으로 차트에 데이터를
: : : : 연속적으로 출력하는 부분을 만들고 있습니다.
: : : :
: : : : 헌데 thread는 정상적으로 도는것 같은대..
: : : : 차트 출력이 되지안아 질문드립니다.
: : : :
: : : : 지금 구성은
: : : : 연결 버튼을 클릭 하면 메인에서 데이터장치를 Initiallize를 합니다.
: : : : 즉 장치와 연결을 하구요, 그 다음이 thread부분에서 장치로 부터
: : : : 데이터를 얻어와 메인에 선언된 차트에 실시간으로 데이터를 뿌려주는 되는대
: : : : 그 부분이 잘 안됩니다.
: : : :
: : : : 아직초보라서.. 자세한 설명부탁드립니다.
: : : : thread 부분 헤더와 cpp 첨부합니다.!
: : : :
: : :
: : : 안녕하세요.
: : :
: : : 소스를 보니 Display가 안될 수 밖에 없네요.
: : :
: : : Main Thread가 While Loop를 계속 수행하고 있기 때문에, Form의 Message Loop를 탈 수 있는 시간이 없네요.
: : :
: : : 그리고, 위의 첨부하신 소스를 보면 굳이 Thread를 쓸 필요가 있었는지 의문이 되네요.
: : :
: : : 차라리 타이머를 사용하는 것이 더 낫지 않을까 생각이 됩니다.
: : :
: : : 굳이 Thread를 사용하셔서 효율을 높이려면,
: : :
: : : Data를 얻어오는 부분과 Chart에 데이터를 넣는 부분을 구분하여 작업을 하시면 될 것 같네요.
: : :
: : : Data를 얻어오는 부분은 Thread에서 구현하고, Chart에 넣는 부분은 Main Thread에서 담당하도록요.
: : :
: : : 제 기억으로는 TChart가 Thread Safe하지 않은 걸로 알고 있네요.
: : :
: : : 도움이 되시길...
: :
: : 용덕님 답변 감사합니다. 말씀하신 부분 참고하여 thread 수정하였구요.
: : thread 에서는 데이터만 취득해서 main으로 넘겨 차트에 뿌렸습니다.
: : 한가지 더 궁금한 것이 있습니다.
: : 차트에 값이 들어가 실시간으로 그래프가 그려지기는 합니다.
: : 헌데 어떠한 이유인지는 모르겠지만 실시간이라기 보다 인터벌이 생깁니다.
: : 측정장비에 손을 넣었다 빼면 한찬뒤에 차트에 그려지더라구요..;;
: : 제가 보기에 어느정도 버퍼에 데이터를 쌓았다가 날리는것 같은대..
: : 이런 부분은 어떻해 하지요?
: : thread 소스 첨부 합니다.
:
: 안녕하세요.
:
: 소스를 확인해보니, 말씀하신것처럼 Data를 Thread에서 데이터만 취득하는 방식이 아니네요.
:
: 소스를 보면, Worker Thread에서 DataChart 라는 함수를 Synchronize를 이용해서 호출하셨는데요,
:
: 지금 작업하신 부분을 해석해 드리자면,
:
: Synchronize 함수는 Worker Thread가 Main Thread와의 동기를 맞추기 위해서,
:
: Synchronize 안에 있는 함수를 Main Thread에서 호출하라는 뜻이고,
:
: Worker Thread는 Synchonize 안에 있는 함수의 호출이 마쳐질때까지 Block되어 있게 됩니다.
:
: Worker Thread는 Main Thread가 DataChart를 호출하게 만들고, 끝날때까지 기다렸다가,
:
: 다시 Main Thread가 DataChart를 호출하게 만들고...
:
: 결국 Worker Thread는 하는 일이 없는거죠.
:
: 제가 이 소스에 대해서 정확하게는 모르지만, 대강 수정을 해본다면...
:
: void __fastcall ChartThread::Execute()
: {
: Go2Data data = GO2_NULL;
: DataContext context;
: context.memory = NULL;
: double oriz = -294.91;
: int i =0;
: double x;
: double z;
:
: while(!Terminated)
: {
: //while(!Terminated)
: while( i < NUM_PROFILES)
: {
: if (Go2System_ReceiveData(Form1->system, RECEIVE_TIMEOUT, &data) == GO2_OK)
: {
: for(j = 0; j < Go2Data_ItemCount(data); ++j)
: {
: OutputDebugString( IntToStr(j).c_str());
: //OutputDebugString( IntToStr(i).c_str());
: Go2Data dataItem = Go2Data_ItemAt(data, j);
: if (Go2Object_Type(dataItem) == GO2_TYPE_PROFILE_DATA)
: {
: unsigned int profilePointCount = Go2ProfileData_Width(dataItem);
: unsigned int profileSizeBytes = profilePointCount * sizeof(short int);
: //allocate memory
: if (context.memory == NULL)
: {
: context.memory = (short int*)malloc (NUM_PROFILES * profileSizeBytes);
: // context.memory = (short int*)malloc (2*profileSizeBytes);
: }
: context.profileWidth = Go2ProfileData_Width(dataItem);
: context.xResolution = Go2ProfileData_XResolution(dataItem);
: context.zResolution = Go2ProfileData_ZResolution(dataItem);
: context.xOffset = Go2ProfileData_XOffset(dataItem);
: context.zOffset = Go2ProfileData_ZOffset(dataItem);
: // memcpy(&context.memory[i * profilePointCount], Go2ProfileData_Ranges(dataItem), profileSizeBytes);
: memcpy(&context.memory[profilePointCount], Go2ProfileData_Ranges(dataItem), profileSizeBytes);
: }
: }
: //여기서 Main Thread에 context Data를 넘겨줄 방법을 모색
: //참고로 여기서 Form1->CameraDataChart(&context); 를 호출하게되면 Worker Thread가 GDI를 건드리게 되서 에러가 발생할겁니다.
: }
: //Synchronize(DataChart);
: //---- Place thread code here ----
: }
:
: 도움이 되시길...
말씀하신대로 코딩도 변경해보고 context를 다른 방법으로도 넘겨 보왔지만
역시나 인터벌이 생기네요.ㅠ
어떤 부분에서 버퍼에 쌓았다가 날리는 해결해보고 싶은대 정말 도통 모르겠습니다.
main과 Thread를 같이 첨부합니다.ㅠ
무엇이 문제인지..; 지적 및 한말씀 부탁드립니다..!
|