귀하는 손님 이십니다
로그인
회원가입
  
  델마당 공식 은행계좌
  하나은행 227-910235-83607
  예금주 이상국(운영진)
프로젝트 게시판
투표게시판
델마당소개
기초부터 활용까지! 델파이 교육 - 데브기어
 광고문의 :
질문과 답변 질문과 답변 입니다.
글내용 - 질문과 답변
 [질문]쓰레드에서 Syncronize시에 문제가 발생합니다.
비소리
(고연우)
2019-06-07 오전 10:46:31
163회 조회


등록된 파일이 없습니다.

1. 개발/실행 플랫폼

(1) OS : WIN10

(2) 개발툴 : 델파이2010

(3) 사용 Database : Oracle

2. 개발 중인 프로그램 : 

3. 질문 내용 :

 

Queue(IOCP)에 데이타를 쓰고 읽어와서 메인폼을 업데이트 해 주는 프로그램을 테스트중입니다.

프로그램은 MainForm, PushThread, PopThread로 구성되어 있습니다.

MainForm은 두개의 Thread를 생성하고 이벤트를 연결하고 ListView를 가지고 있습니다.

Push_Thread 는 조건검색 후 해당하는 데이타를 Queue에 Push합니다.
Pop_Thead는 데이타를 처리하고 결과를 Main에 Noti합니다.

문제는 Pop_Thread인데요. 특정함수에서만 Synchronize가 동작하지 않습니다.
전체 소스를 다 올릴 수 없으니 예시로 작성하겠습니다.


procedure TPop_Thread.MainUpdate;
begin
  // On_cB에서 호출시에는 로그가 찍히지 않습니다.

 Log(">>>>>>> start MainUpdate >>>>>>"
  if Assigned(FOnMainUpdate) then FOnMainUpdateNotify;
end;

TPop_Thread.Excute;
begin
  while not Terminated do
  begin
    try
      TryPop();
    except
      //
    end;
    
    Application.ProcessMessages;
    WaitForSingleObject(Self.Handle, 1);
  end;
end;

procedure TPop_Thread.TryPop;
begin
  try
    while Queue.TryPop(QueueData) do
    begin
      case QueueData.QueueDataType of
        cA : On_cA( @(QueueData.On_cAHeader) );
        cB : On_cB( @(QueueData.On_cBHeader) );
        cC : On_cC( @(QueueData.On_cCHeader) );
      end;
    end;
  except
    //
  end;
end;

procedure TPop_Thread.On_cA(AOn_cAHeader : POn_cAHeader);
begin
  // 처리
  Synchronize( MainUpdate );
end;

procedure TPop_Thread.On_cB(AOn_cBHeader : POn_cBHeader);
begin
  // AOn_cBHeader 내용 로그기록(정상)
  
 Log(">>>>>>> Call MainUpdate >>>>>>"
  // 문제발생. Synchronize 자체가 실행이 안되는듯.
  Synchronize( MainUpdate );
end;

procedure TPop_Thread.On_cC(AOn_cCHeader : POn_cCHeader);
begin
  // 처리
  Synchronize( MainUpdate );
end;

이런식으로 구성되어 있는데요. On_cA, On_cC에서는 MainUpdate가 잘 되고 있습니다.
문제는 On_cB에서는 Synchronize( MainUpdate ) 호출시 메인프로그램이 먹통이 됩니다.
혹시나 싶어 On_cB와 MainUpdate쪽에 로그를 찍어보면 On_cB에서 호출전까지만 찍힙니다.

데이타 문제인가 싶어 On_cB에서 다 막고 데이타만 입력해서 테스트도 해봤는데도 안되더라구요.

다른 폼을 하나 만들고 동일한 데이타(AOn_cBHeader)를 만들어서 Queue에 넣어보면 정상처리되구요.


다만 Thread에서 생성된 데이타는 처리를 못하고 있습니다.

제가 C만 해오다 전임자가 만들어놓은 델파이 소스를 보고 있자니 참 많은게 헷갈립니다.ㅜㅜ
이거 원인이 뭘까요?