2009-12-15 2 views
1

I 네 I 개발 야/CLI GUI ++는 C 스레드 가지고 는 C++/CLI 효율적인 멀티 스레드 원형 버퍼

  • GUI는 자체
  • 배경 처리 스레드

    1. 수집 원시 데이터 청크를 취하는 유용한 정보 나 원시 데이터 C있어

    다른 세 개의 스레드를 연결하는 컨트롤러로

  • 사도 행전의 원시 데이터 및 생산 컨트롤러에 결과를 게시하고 게시하는 ollector가 있지만 다음 단계는 GUI와 백그라운드 프로세서가 액세스 할 수 있도록 모든 결과를 저장하는 것입니다.

    새로운 원시 데이터는 한 번에 하나의 결과로 정기적 (빈번한) 간격으로 공급됩니다. GUI는 도착한 각 새 항목에 액세스합니다 (컨트롤러가 새 데이터를 발표하고 GUI가 공유 버퍼에 액세스 함). 데이터 프로세서는 주기적으로 버퍼의 청크 (예 : 초의 가치)를 읽고 새로운 결과를 생성합니다. 이렇게 효과적으로, 1 명의 생산자 및 2 명의 소비자가 액세스해야합니다.

    나는 주변에서 사냥을 해왔지만, CLI가 제공하는 모든 것들은 그렇게 유용한 것 같지는 않다. 수집기에 대한 쓰기 잠금 및 GUI 및 데이터 프로세서에 대한 읽기 잠금을 허용하는 공유 순환 버퍼입니다. 이렇게하면 버퍼의 섹션이 기록되지 않는 한 여러 스레드가 데이터를 읽을 수 있습니다.

    제 질문은 : 이것을 구현할 수있는 .net 라이브러리에 간단한 해결책이 있습니까? 나는 내 자신을 굴리는 것에 대해 화가 났는가? 이 작업을 수행하는 더 좋은 방법이 있습니까?

  • 답변

    1

    은 가능한 문제를 바꿔하는되도록 : 그것은 제어기에 전달

  • ...

    1. 수집기는 새로운 데이터 포인트를 수집한다.
    2. 컨트롤러가 GUI "NewDataPointEvent"...
    3. ...을 발생시키고 데이터 포인트를 배열에 저장합니다.
    4. 어레이가 가득 찬 경우 (또는 처리 준비가 된 경우) 컨트롤러는 프로세서 ...
    5. ...에 어레이를 보내고 새 어레이를 시작합니다.

    스레드간에 전달 된 값이 공유 된 후에 수정되지 않으면 사용자 지정 스레드로부터 안전한 컬렉션 클래스가 필요하지 않게되고 필요한 잠금을 줄일 수 있습니다.

  • +0

    내 반복 질문에 맞습니까? 컨트롤러가 빠른 필터링을 수행하면 데이터가 변경되지 않습니다. 제안 사항이 적용될 수도 있지만 GUI에는 데이터 프로세서의 사본과 백그라운드 프로세서가 필요합니다. 나는 그저 곳곳에 메모리를 할당하고 할당을 해제 할까봐 걱정했다. 그래도 그 곳에서 데이터의 복사본을 보내면 물건이 느려지는지 알 수 있습니다. –

    +1

    메모리 할당/할당 해제가 염려되면 2 개의 벡터를 사용하는 것이 좋습니다. 생산자, consummer에 대한 하나). 당신은 단지 빠른 조작 인 주위를 교환 할 수 있습니다. 또한, 당신이 resize (0)을 clear 대신에 사용한다면, alloc/reallocation이 없도록 용량을 유지해야합니다 ... 물론 올바른 장소에 자물쇠를 넣어야합니다 – Arthur