3

私は奇妙な問題を抱えています。メイン フォームに 500 ミリ秒をトリガーする TTimer があります。フォームが作成された後。

IDE から実行すると正常に動作しますが、他の W7 PC で実行するとメイン フォームは作成されますが、タイマーが起動しません。(一部のコンポーネントは更新されません) コントロールをクリックすると、すべてが更新され、タイマーが起動し、すべて問題ありません。フォームを移動すると、すべてが更新されますが、タイマーは開始されません。Delphi がインストールされた PC で実行すると、問題なく動作します。問題ない。

MyForm.OnCreate のコードは正常に実行されます。Timer.Enabled := True変化しません。

これの原因は何ですか?私は本当にここで立ち往生しています。

よろしくお願いします。

4

2 に答える 2

5

さまざまな可能性があります。

  1. WM_TIMERメッセージは、メッセージキューが空の場合にのみ配信されます。アプリ内の何か、または他のコンピューターで実行されている別のアプリ内の何かが、そのウィンドウのメッセージキューが空にならないほど頻繁にウィンドウハンドルにメッセージを投稿している場合、WM_TIMERイベントは発生しません。これが発生した場合、通常のTTimer期間の10倍、20倍、または30倍待機する必要があるかもしれませんが、最終的にはイベントが発生する可能性があります。タイマーがまったく作動しないという状況は今のところ観察されていませんが、もちろん理論的には可能です...

  2. タイマーが有効になっている(有効に設定している)ことは確かだと言っていますが、コードのどこかでタイマーを無効にしている可能性があります。

  3. いくつかの試行を行っていた場合.....endブロックを除いて、例外を無視すると、他のマシンでは見られない何か悪いことが起こっている可能性があります。

  4. タイマーコードが起動している可能性がありますが、タイマーで実行されるコードで例外、クラッシュ、またはハングが発生している可能性があります。

  5. コード内に、ほぼ「無限のループ」状況を作成する一連のDelphiイベントハンドラーが含まれている可能性があります。これは、作成したイベントハンドラーの一部が、望まないときに起動し、副作用を引き起こし、アプリケーションがビジーです。どこかをクリックしていると、問題が解決したとのことです。そのクリックは、コード内の他の悪循環を中断するのに十分かもしれません。

  6. あなたはそれがdelphiがインストールされているすべてのPCで動作すると述べています。いくつかの制限があるサードパーティのコントロールを使用していますか(デバッガー内で実行する必要があるなど)。または、アプリは他のコンピューターにインストールされていないDLLまたはBPLをロードしますか?

何も含まれていない新しいアプリケーションから始めます。TTimerを追加します。次に、タイマーイベントで整数フィールド値をインクリメントし、その値をフォームのキャプションに書き込みます。次に、他のマシンで実行します。それはうまくいくでしょう。

次に、作成したコードの巨大な山を見て、コードの巨大な山を二等分して、壊れている半分を見つける方法を決定します。十分な手順を実行すると、問題が見つかります。ここの誰もあなたのためにそれをデバッグすることはできません。

OutputDebugStringアプリケーションの内部を他のマシンで確認したい場合は、他のマシンでDebugViewを使用して実行し、ログメッセージを追加してみてください。

于 2012-08-16T00:23:43.687 に答える