0

COM ポートでデバイスに送受信する TThread があります。データを読み取った後、Synchronize(関数名) を使用して (同じスレッドではなく) GUI をアクティブにしたいと考えています。しかし、GUI のフォーム関数を呼び出してボタン クリックを実行すると、アクセス違反が発生します。フォームの値が null であるかどうかを確認しましたが、そうではありません。これはアクセス違反の明らかな理由になるからです。現在、グローバル フラグを設定し、特定の条件が満たされているかどうかを継続的にチェックするタイマーを使用しています。満たされている場合は、そのフォームでボタン クリック イベントを発生させます。それがアクセス違反を回避する唯一の方法のようです。

私は本当にタイマーが好きではないので、フォームでタイマーを使わなくても済むようにする方法はありますか?

4

2 に答える 2

0

問題が見つかりました。Form が null かどうかを確認していると思っていましたが、そうではありませんでした。私が参照していたフォームが ではないことを確認して修正しましたnull

編集: Fbutton1Click() を呼び出すときに呼び出されるフォームの 1 つがモーダルであるため、スレッドがブロックされることがわかりました。代わりにボタンクリックを呼び出すためにタイマーに戻る必要がなくなりました..まあ。

于 2009-12-08T20:42:20.280 に答える
0

問題のウィンドウにメッセージを投稿できます。タイマーも同様に機能します。フォーム内で Windows メッセージを送信するだけです。あなたは明らかにウィンドウへのハンドルを持っています。

CWnd::PostMessage(...)送信メッセージを使用しないでください。インラインで処理され、スレッドの動作が停止する可能性があります。

通常、Guithread にアクセスしようとするワーカー スレッドがある場合、それらは競合します。MFC とスレッドを使用してからしばらく経ちましたが、それは私が覚えていることです。そのように動作することが文書化されていると思います。

于 2009-12-07T22:02:15.963 に答える