Q&A

  • [경험]듀얼코어 이상에서 쓰레드사용시.. 버벅이는 문제
안녕하세요..
이번에 서버교체 작업을 한 뒤 문제가 생겼던 부분인데요..
펜티엄III 500에서 잘돌아가던 프로그램이 듀얼코어제온으로가니깐..
완전 바보가 되더군요.. 혹시나 저같이 만드셔서 고생하시는 분들이 있지
않을까하는 맘에.. 올립니다.

게시판을 열심히 찾아본결과 해결방안은 쓰레드별, 프로세스별, 프로세서별로
강제할당하는 방법에 대한 내용이 많더군요.. 열심히 따라해봐도.. 별 변화가
없어.. 노가다 좀 했습니다.

결국 문제는 Synchronize는 메인 vcl 콤포넌트에 접근하는 관계로 사용했는데..
이 프로시져에서 처리할 내용이 있는지 확인하는 단계에서 문제가 발생했습니다.
왜 그런지는 아직 ㅡ,.ㅡ




//--------------  수정 전 코딩  --------------------//
procedure TStockThread.Execute;
begin
   While Not Terminated do
   Begin
      Synchronize(DBProcessing);        
      ...
      ...
      ...
   End;
end;

procedure TStockThread.DBProcessing;
Begin
   //TList의 데이터 확인 후 처리
   If mStockRecord.Count <= 0 Then
   Begin
      Application.ProcessMessages;
      Sleep(1);
      Exit;
   End;

   //작업내용
   ...
   ...
End;


위의 코딩을 아래와 같이 수정


//--------------  수정 후 코딩  --------------------//
procedure TStockThread.Execute;
begin
   While Not Terminated do
   Begin
      //TList의 데이터 확인 후 처리
      If mStockRecord.Count <= 0 Then
      Begin
         Application.ProcessMessages;
         Sleep(1);        
      End
      Else
         Synchronize(DBProcessing);        
      ...
      ...
      ...
   End;
end;

procedure TStockThread.DBProcessing;
Begin
   //작업내용
   ...
   ...
End;
1  COMMENTS
  • Profile
    전상현 2007.11.03 04:26
    저도 비슷한 경험을 했었답니다.
    여러번 디버깅을 해보다가 발견한건데 제 경우엔
    Application.ProcessMessages; 에 문제가 있다는 결론을 얻었답니다. 쓰레드 루틴에 본 함수를 추가할 경우 장시간 대기하는 현상이 종종 발생해서 전체 루틴이 저속으로 돌아가더군요.
    저같은 경우에 본 함수 호출없이 Sleep 만을 호출하는 방식으로 문제를 해결 했었는데 본 문제의 원인은 저도 잘 모르겠네요 ^^;
    암튼 쓰레드안의 루핑에서 Application.ProcessMessages; 호출은 타이머를 앞뒤로 박아주고 디버깅을 철저히 한 후 넣어줘야 할듯 싶네요