はじめまして、やまぐちです。
アプリケーション実行中にEAccessViolationの例外が発生し困っています。
例外が発生する原因の一つとして処理の重複と考えています。
現在実行中の処理をWindowsに渡してから次の処理を行う方法がありましたら教えてください。
よろしくお願いしますm(__)m
どういう処理を、何に渡すんでしょうか。
Windows=OSで、処理=Messageならば、PostMessageでなく、SendMessageで送れば、Messageが処理されてから戻り値を返します。
# Performメソッドの内部処理ではPostMessageを使っていたと思いますが、未確認です
別のことであれば、もう少し説明を加えてみてください。
追記。
Performは、PostMessageでもSendMessageでもなく、WindowProcを直接呼んでいました。
# ここでの質問で前に調べたことがありましたね…忘れてました
やまぐちです。
にしのさん、お返事ありがとうございます。
どういう処理を、何に渡すかをきちんと書いていなかったです。すみません。
ある開発キットを使いフォームにあるものを描画しています。
マウスダウン時、マウスアップ時、マウスムーブ時に再描画を行います。
その描画時に開発キットのDLLエラーがまれに起こるので現在実行中の描画処理
を終えてからマウスダウン、マウスアップ、マウスムーブを実行したいのです。
分かりづらくてすみません。
よろしくお願いいたします。
描画はDelphiのFormに対してですか?
つまり、描画中に描画されると例外が発生すると。
何となくわかるのですが、サンプルが作れず未確認情報しか提示できません。
たとえば、オフライン画面を用意して、そちらに描画させ、Formへの描画はそのオフライン画面をコピーするという手段ではだめですか?
やりかたは、FormCreateなどで、TBitmapのオブジェクトを作成。
開発キットの描画ルーチンには、TBitmap.Canvas.Handleを与える。
あとは、CanvasのCopyRectでコピーするだけです。
CopyRectのときには、前後でLock,Unlockしたほうがいいかもしれません。
でもこれだと、開発キットが描画し終えたことを知ることはできないので、描画のタイミングは適当(タイマーで定期的になど)になります。
何か、DLLが処理を終えたことがわかる方法があればいいんですが。
お返事ありがとうございます。
描画はDelphiのFormに対してです。
教えていただいた内容を確認してみようとしましたが、やはり開発キットで指定された関数内で描画するので描画のタイミングを図ることが難しくできませんでした。
実際にエラーが起こるのは開発キットで作成した画像を指定関数で拡大、縮小などを行うと描画処理が発生しエラーがおきてしまいます。
にしのさんがおっしゃるとおりDLLが処理を終えたことがわかる方法があれば一番のぞましいのですが。
DLLが落ちるのは回避出来なさそうですね。
道連れでアプリケーションが終了しないように、別EXEで起動して、そちらから描画させるようにしてみてはどうですか?
本体アプリは、
・描画用アプリが起動していなければ、描画用アプリを再起動。
・描画用アプリに対して、マウスの位置情報、その他の情報を送る。
描画用アプリは、
・本体アプリから起動したのでなければ終了。
・送られてきた情報で、本体アプリを描画。
今ふと思ったのですが、EAccessViolationが発生した後アプリケーションは落ちますか?
また、EAccessViolationが発生する箇所は、DLLの関数を呼び出すところではありませんか?
もし、アプリケーションが落ちずに、DLLの関数を呼び出すところで例外が発生しているのであれば、DLLを再度LoadLibraryしてやればうまく動くかもしれません。
やはりDLLが落ちるのは回避出来なさそうですか。
EAccessViolationが発生する箇所は、DLLの関数を呼び出したところです。
アプリケーション自体は落ちないので例外が発生したところで再度描画することで回避しました。
分かりづらい質問にお答えいただき感謝します。
ありがとうございました。
すみません。
解決のチェック入れるの忘れました。
ツイート | ![]() |