2011-04-07 2 views
0

System.Threading.Thread를 사용하여 C# .NET 1.1에서 Ticker 구성 요소 (System.Windows.Forms.UserControl)를 만들었습니다. 이 티커는 오른쪽에서 왼쪽으로 스크롤하고 xml 피드에서 데이터를 읽습니다. 이 구성 요소는 비디오 및 다른 프로세스가 실행중인 메인 애플리케이션에서 호출됩니다.C# .NET 1.1의 티커 구성 요소에서 CPU 사용 제한

티커 구성 요소없이 응용 프로그램을 테스트하면 CPU 최대 55 %가 소모되지만 티커 구성 요소를 통합하면 95 %까지 올라갑니다.

또한 System.Windows.Forms.Timer를 사용해 보았지만 결과도 동일했습니다. 구문 분석 XML 데이터의

은 구성 요소의 초기화 중에 발생하고 여기에 시세가 스크롤 처리 할 샘플 코드입니다 : 어떤 도움이 높게 평가되어

Thread _mainThread; 

private void InitTickerThread() 
{ 
_panelHeadlines = (Panel) FindControl("panelHeadlines", this); 

if(_panelHeadlines != null) 
{ 
    _textWidth = _panelHeadlines.Size.Width; 
} 

_locXOffset = 0; 

_mainThread = new Thread(new ThreadStart(StartScrolling)); 
_mainThread.Name = "Main Ticker Thread"; 
_mainThread.Priority = ThreadPriority.Lowest; 
_mainThread.IsBackground = true; 
_mainThread.Start(); 
} 

private void StartScrolling() 
{ 
while(true) 
{ 
    lock(this) 
    { 
     _locXOffset -= 1; 


     if (_locXOffset < -_textWidth) //If entire ticker content has finished scrolling. 
     { 
      _locXOffset = 0; 
      _partnerCtr = 0; 

      Partner p = _arrListPartners[_partnerCtr] as Partner; 
      if(p != null) 
      { 
       pbPartnerLogo.Image = p.Logo; 
       _partnerContentWidth = p.ContentWidth - _offsetToChangeLogo; 
      } 
     } 
     else 
     { 
      if(_locXOffset < -_partnerContentWidth) 
      { 
       _partnerCtr++; 

       if(_arrListPartners.Count > 0) 
       { 
        if(_partnerCtr < _arrListPartners.Count) 
        { 
         Partner p = _arrListPartners[_partnerCtr] as Partner; 

         if(p != null) 
         { 
          pbPartnerLogo.Image = p.Logo; 
          _partnerContentWidth = p.ContentWidth - _offsetToChangeLogo; 
         } 
        } 
       } 
      } 
     } 


     _panelHeadlines.Location = new Point(_locXOffset, 0); 

     Invalidate(); 

     Thread.Sleep(20); 
    } 
} 
} 

은. 감사!

+0

백그라운드 스레드가 매 20ms마다 작업을하고 있으며, 이는 초당 50 번입니다. 나는 그것을 극적으로 철회 할 것을 제안 할 것이다. – Lazarus

+0

필자는 실제로 스크롤 속도를 얻기 위해 20ms로 설정했습니다. –

답변

0

20 밀리 초마다 전체 구성 요소가 다시 그려집니다. 이것은 매우 비쌉니다. 나의 충고는 수면을 높이거나 코드를보다 효율적으로 만드는 것이다.

+0

응답 주셔서 감사합니다. 나는 스크롤러 속도 요구 사항을 달성하기 위해 20 밀리 초로 설정했다. 다른 대안? –

+0

예, 한 번에 1 픽셀 이상으로 이동하고 빈도를 줄이거 나 늘리십시오. – Lazarus

+0

일부 코드 스 니펫 샘플을 제공 할 수 있습니까? _locXOffset을 2 이상으로 줄여야한다는 뜻입니까? –

0

전경 UI 스레드에 메시지를 게시하여 UI 컨트롤을 업데이트 하시겠습니까? (귀하의 코드 샘플이 완전하지 않아 실제로 알 수 없습니다.)

+0

InitTickerThread를 호출하는 메서드는 xml 데이터를 구문 분석하고 각 적절한 텍스트를 LinkLabel에 입력하여 클릭 할 수있게합니다. 링크 레이블이 Windows.Forms.Panel에 추가되고 해당 패널을 컨트롤에 추가합니다. 예 : this.Controls.Add (pnlTickerItems); –

관련 문제