2010-12-10 7 views
2

스레드 및 컨트롤에 대한 질문이 있습니다. 동기화 모달 대화 상자를 만들었습니다. 세 개의 진행 표시 줄과 캡션이 두 개 있습니다. 응용 프로그램을 처음 열면 대화 상자가 열리고 업데이트 작업이 수행됩니다. Show() 대화 상자에서 세 가지 다른 스레드를 만듭니다. 각 스레드는 데이터 다운로드, xml 구문 분석 및 데이터베이스 삽입을 제어합니다. 진행률 표시 줄에 진행률을 표시합니다. 모든 설명, 잘 작동합니다.스레드 중지시 창 닫기

이제 문제가 있습니다. 모든 항목을 다운로드하여 구문 분석하고 데이터베이스에 삽입 할 때이 대화 상자를 자동으로 닫고 싶습니다. progressbar.position이 progressbar.max와 같은지 확인하고 스레드가 종료되었는지 확인해 보았습니다. 진행률 표시 줄로 가면 대화 상자가 너무 일찍 닫히고 진행률 표시 줄이 완전히 끝나지 않습니다. 스레드를 검사하는 방식으로 진행하면 진행 막대가 프로세스 중간에서 멈추고 그게 전부입니다.

어쩌면 당신이 해냈어, 델파이 n00b, 어떻게 그것을하는 가장 좋은 방법입니다. 사전에

감사합니다 ...

답변

5

의 세부 사항, 당신은 단지 스레드에서 3으로 초기화 "스레드 개수"변수를 감소하기 위해 (주 스레드의 컨텍스트에서 실행) 스레드 마지막 OnTerminate 이벤트를 사용할 수 있습니다 창조의 순간.

스레드 수가 0에 도달하면 양식을 안전하게 닫을 수 있습니다.

begin 
    //..thread creation, stuff 
    FThreadCount := 3; 
    DownloadThread.OnTerminate := DecThreadCount; 
    ParseThread.OnTerminate := DecThreadCount; 
    InsertThread.OnTerminate := DecThreadCount; 
    //resume threads and other stuff 
end; 

procedure TForm1.DecThreadCount(Sender: TObject); 
begin 
    Dec(FThreadCount); 
    if FThreadCount = 0 then 
    Close; 
end; 
+1

+1 내 "게시물 게시"답변보다 훨씬 간단합니다! –

+0

나는 그것을 시험해 볼 것이다,이 ThreadDecCount 어떤 종류의 사건인가? – evilone

+0

@Evilone : TNotifyEvent입니다. – jachguate

1

내가 때를 완료하여 스레드가 대화에 다시 메시지를 게시 할 수 것입니다. 세 개의 메시지를 모두 받으면 대화 상자를 닫을 수 있습니다.

+0

저는 delphi에서 새롭습니다. 어떻게 그 메시지를 게시합니까? 메시지 전달/전송 메시지? 예를 보여줄 수 있습니까? – evilone

+0

@evilone이 경우에 전화를 걸 수 있습니다. 기본 win32에 대해 배우려면 Petzold의 책을 읽어야합니다. –

2

Windows Vista 또는 Windows 7을 사용하고 있습니까? Microsoft는 Vista에서 진행률 표시 줄이 작동하는 방식을 변경하여 지시 된 위치로 즉시 이동하는 대신 점진적으로 진행률 표시 줄로 이동합니다. 즉, 진행 상황을 실제로 완료 할 수 있지만 바에서 다른 초를 나타낼 수는 없으므로 진행하기 전에 대화 상자가 닫힌 것처럼 보입니다. 특히 바의 진행 단계 수가 적을 경우에는 특히 그렇습니다.

그것은 좀 추한하지만,이 같은 일을 수행하는 도우미 함수를 사용하여이 문제를 해결할 수 있습니다 : 이것은 바로 올바른 위치로 이동되도록한다

procedure UpdateProgressBar(bar: TProgressBar); 
begin 
    bar.StepIt; 
    bar.Max := bar.Max + 1; 
    bar.Max := bar.Max - 1; 
end; 

.

편집 :이 간단한 일이 들어 How do I make TProgressBar stop lagging?

+0

+1 @Mason 이제 당신이 말하는 것은 당신이 묘사 한 효과를 보았습니다. 이 문서는 어디서든 문서화 되었습니까? 아니면 경험을 통해 작업 했습니까? –

+0

@David : 실제로 StackOverflow에서 이것에 대해 묻는 것으로 배웠습니다. 편집에 링크를 추가했습니다. –