2010-12-10 14 views
2

スレッドとコントロールに関する質問があります。私はモーダルダイアログを同期させました。 3つのプログレスバーと2つのキャプションがあります。アプリケーションが初めて開かれた場合は、ダイアログの同期が開き、更新が行われます。ダイアログShow()メソッドで私は3つの異なるスレッドを作成します。各スレッドは、データのダウンロード、xmlの解析、データベースの挿入を制御します。そしてプログレスバーに進行状況を表示します。記載されているすべては正常に動作しています。スレッド停止時にウィンドウを閉じる

問題点 - すべてのアイテムがダウンロードされ、解析され、データベースに挿入されると、このダイアログを自動的に閉じたいと考えています。 progressbar.positionがprogressbar.maxと等しいかどうかを確認しようとしました。スレッドが終了しているかどうかを確認しました。プログレスバーの方法では、ダイアログが早すぎると終了し、プログレスバーの1つが完全に終了しません。私がスレッドをチェックして行くと、プログレスバーはプロセスの途中で止まり、それだけです。

おそらく、あなたはそれをして、Delphi 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

私は、彼らが完了したときに、あなたのスレッドが戻っダイアログにメッセージを投稿する取得したいです。 3つのメッセージがすべて受信されると、ダイアログを閉じることができます。

+0

私はdelphiで新しいです。どのようにそれらのメッセージを投稿しますか?ポストメッセージ/セールメッセージ?私に例を教えてもらえますか? – evilone

+0

@eviloneこの場合、どちらかを呼び出すことができます。基本的なwin32について知るには、Petzoldの本を読んでください。 –

2

Windows VistaまたはWindows 7をお使いですか?マイクロソフトでは、進行状況バーがVistaで動作する方法を変更したため、指示された位置にすぐにジャンプするのではなく、徐々にその方向にスライドします。これは、あなたの進捗状況が実際に終了することができることを意味しますが、バーにはもう1秒間は表示されないため、完了する前にダイアログが閉じるように見えます。

それはちょっと醜いですが、あなたはこのような何かを行うヘルパー関数を使用してこの問題を回避することができます。これは、それはすぐに正しい位置にジャンプすることが保証されます

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

EDIT:この単純なことのためにHow do I make TProgressBar stop lagging?

+0

+1 @Mason今あなたが言っていることは、あなたが描いた効果を見たことがある。これはあなたが知っているどこに文書化されていますか、経験からそれを解決しましたか? –

+0

@David:私は実際にこれについてStackOverflowで尋ねることでこれを学びました。編集にリンクを追加しました。 –

関連する問題