2013-07-12 4 views
-2

사용자가 Excel 파일에 기록 된 정보를 제공하면 Excel COM을 선택하여 데이터를 읽습니다. 그러나 사용자가 N 개의 파일로 프로세스를 반복 할 수 있고 프로세스에 다소 시간이 걸릴 수 있으므로이 루틴을 분리 된 스레드로 이동하기로 결정했습니다.Delphi에서 TThread를 대기 및 종료하는 방법 (완료시 사용자에게 알립니다)

따라서이 작업을 수행하는 방법을 정의하려면 귀하의 조언이 필요합니다.

나머지 파일이 없어 질 때까지 작업자 스레드를 삭제할 수 없습니다. 스레드 내부에서 데이터는 ClientDataSet에로드되고 마지막에는 데이터베이스에 적용됩니다.

작업이 완료되면 사용자에게 알리는 것이 필요하므로 다른 파일을로드하고 스레드를 다시 실행할지 또는 작업을 완료할지 결정할 수 있습니다.

스레드를 올바르게 파괴하고 사용자에게 알리는 방법은 무엇입니까? 나는

+0

TWorker 스레드의 Execute 메서드 호출은 심각한 버그입니다. 코드는 여전히 주 스레드의 컨텍스트에서 실행됩니다. 대신 Start 메서드를 호출해야합니다. – pf1957

+0

여기에 무엇을 묻고 있습니까? –

+0

1. OnFinish가없고 OnTerminate를 이미 찾았습니다. 2. 그게 달렸어. –

답변

7

만들고 각 파일에 스레드를 파괴해야 하는가?

매우 효율적인 디자인은 아닙니다. 스레드 안전 대기열에 파일을 넣은 다음 스레드가 아직 실행되고 있지 않으면 스레드를 시작한 다음 대기열 util을 통해 스레드 루프를 비 웁니다. 그때 스레드는 파괴되거나 더 많은 파일이 나중에 대기열에 들어갈 경우 잠자기 상태가 될 수 있습니다.

또한이 디자인을 사용하면 스레드 풀을 구현할 때 여러 파일을 병렬로 처리 할 수 ​​있습니다. 파일을 대기열에 넣을 때 이미 대기중인 유휴 스레드가없는 경우 새 스레드를 시작하십시오. 스레드가 시작되면 대기열에서 다음 사용 가능한 파일을 당깁니다. 스레드가 완료되면 큐에서 다음 파일을 가져올 수 있으며 파일이 없으면 나중에 다시 사용할 수 있도록 풀로 돌아갑니다.

그렇다면 제대로 스레드를 파괴하고 사용자에게 알리는 방법은 무엇입니까? 당신이 스레드를 파괴 할 준비가되면

은 다음 MsgWaitForMultipleOjects()처럼, 또는 이에 상응하는 (그 WaitFor() 메소드를 호출, (true로 설정하면 그 Terminated 주기적으로 재산과 종료를 확인해야하기 위해 Execute() 요구)의 Terminate() 메소드를 호출 스레드가 종료 될 때까지 기다리는 동안 메시지 큐를 응답 가능하게 유지 한 다음 메모리에서 해제 할 수 있습니다. 스레드는 Execute() 종료 후에 해당 OnTerminate 이벤트를 트리거하지만 OnTerminate 이벤트 핸들러에서 스레드를 파괴하는 것은 안전하지 않습니다. OnTerminate 이벤트가 트리거 될 때 스레드를 파괴하려는 경우 (특히 catch되지 않는 예외가 발생한 경우와 같이 스레드 종료가 예상되지 않는 경우) PostMessage(), PostThreadMessage() 등의 비동기 알림을 게시 할 수 있습니다. TThread.Queue(), 등을 삭제 한 다음 나중에 알림이 처리 될 때 스레드를 삭제합니다.

작업 완료시 사용자에게 알리도록 스레드를 설정하는 방법은 무엇입니까? OnTerminate 이벤트를 할당하면?

예. 스레드가 종료하기 전에 여러 파일을 처리하지 않는 한, 스레드는 각 파일 사이에 수동으로 통지를 보낼 수 있습니다.

는 각 파일에 스레드를 만들거나 하나 개의 스레드를 생성하고 어떻게 든 다른 파일에 대한 모든 시간에 실행을 통제하는 것이 낫다? 만들기 및 스레드를 파괴

자원과 처리면에서 OS에 대한 사소한하지 않습니다, 그래서 당신은 다시 사용한다 가능한 한 많은 스레드. 오랫동안 잠을 자지 않는 한, 그들이 할 일이 없을 때 그들을 자게하십시오. 그럴 경우, 당신은 자원을 해제하기 위해 그들을 파괴해야합니다.