2009-08-06 11 views
-7

共同作業者は、長年にわたるより長い操作で進行状況を示すカスタムAVIを使用しています。常にうまく働いています。テーマが有効になっているWindows XP/VistaのTAnimateは動作しません

最近、デルファイ7からデルファイ2007に移行することを決めました。その一部は、彼のアプリケーションのテーマをサポートしています。 (最終的には、ほとんどの人がXPで動作していますが、すべてではありません)。アニメーションが機能しなくなりました。テーマを無効にすると、再び機能します。

TAnimateは、InitCommonControlsEx(ICC_ANIMATE_CLASS)を使用して作成されたWindowsアニメーションコントロールのラッパーです。 MSDNのドキュメントによれば、「ComCtl32.dllバージョン6を使用している場合、スレッドはサポートされていないため、アプリケーションがUIをブロックしないか、アニメーションが発生しないことを確認してください。明らかに、これは意図された動作です。

誰かがこの問題の回避策または代替方法の提案をしていますか?彼が進歩を示している処理は、別のスレッドを生成するのには適していないし、明らかにApplication.ProcessMessagesも良い解決策ではない。

EDIT:a)このトピックに関するRaymond Chenのブログ記事に「欠けているリンク」(言い訳)を提供していたため、この質問に対する正解をRob Kennedyに授与しています。別のスレッドに適切な答えでした。

ここの皮肉なこと:彼がTAnimateをブロックした操作は、使用しているデータベースエンジン(Advantage Database Server、またはADS)のインデックス作成操作でした。彼は私が問題を持って来たときに彼が言及しなかった。

ADSは、TAdsDataSet.AdsRegisterCallbackFunctionメソッドとTAdsDataSet.AdsClearCallbackFunctionメソッドを使用して進行コールバックをサポートします。コールバック関数には、現在の操作の進捗(パーセント)と、関数の戻り値を使用して操作を取り消す方法の両方が用意されています。だから、全体の疑問が疑わしいと分かります。コールバック関数を使用してプログレスバーを更新することができます。プログレスバーは、アプリがハングしていないことをユーザーに示します。

+0

テーマを取得するには7から2007に移動しますか?私はすでにDelphi 7でテーマをサポートしていましたが –

+0

私は「部分的に」言った。 D7は本当にテーマをサポートしていました。彼はただ気付かなかった。 (彼はちょっとラディーだ。) –

答えて

5

Raymond Chen has written about this.スレッドコントロールがうまく動作しない主な理由は、スレッドが別のスレッドに関連付けられたウィンドウに描画されてはならないということです。

あなたの同僚は、タスクを別のスレッドに入れることができなかったと判断されたことを何にでも再確認することをお勧めします。非応答性を隠すアニメーションコントロールがあるかどうかにかかわらず、メインのUIスレッドをブロックするのは良い考えではありません。

+0

ロブ、ありがとう。私はどこかで何かを見たことが分かっていましたが、MSDNの検索ではRaymondの記事は表示されませんでした。彼は依然として別のスレッドが唯一の解決策であるとは反対しています(サードパーティのDLLを呼び出す際に待っているものがあり、そのDLLタスクが完了するまでアプリを続けることはできません)。ユーザーはプロセス中に何らかの種類のアクティビティインジケータを表示するだけで、アプリがフリーズしていないことを知ることができます。 –

1

TThreadsの代わりに、AsyncCallsを使用すると、機能的な観点からマルチスレッド処理への入り口を簡単にすることができます。それでも、これを処理する最善の方法は、バックグラウンドで長いプロセスを実行してアプリケーションを応答可能な状態に保つことです。

関連する問題