ゲームみたいなものを作っていて、最近開発環境を変えたのですが、ウィンドウメッセージを受け取るスレッドと別にゲームメインスレッドをつくっていたのですが、GDI関係で困ってしまいました。
メインスレッドで
InvalidateRect()
を使って画面の再描画要求をした後にTextOutやRectangleでaDC(デバイスコンテキストハンドル)に絵画しようとしたときに
ウィンドウメッセージスレッドは、RADツールの
Sub MainWnd_Paint(hDC As DWord)
BitBlt(hDC,0,0,MX,MY,aDC,0,0,SRCCOPY)
End Sub
(MX:MYはウィンドウの幅と高さです。)
を実行中で、メインスレッドのTextOutなどに渡したaDCが「無効なハンドル」とされて
TextOutされないという現象が発生しました。
前の開発環境(WinXP SP2 Intel Celeron M 1.0GHz AB 5.0CP3)ではそういうことはなく、今の開発環境(WinXP SP2 Intel Pentinum 4 2.93GHz AB CP3)で起こるようになって大変困っています。
対策としてはスレッドの優先度を変えたり、TextOutの前にSleepをつけたりとしたんですが、この現象を完全に防ぐことができませんでした。
ネットで3日調べてもわかりませんでした。
わかりにくい質問かもしれませんが、どなたかご教授おねがいします。
再描画要求
解決策は解りませんが・・・。
CP版で発生した物は、こちらではなくバグ報告版で報告してください。
4.24や4.13では大丈夫ですか?
CP版で発生した物は、こちらではなくバグ報告版で報告してください。
4.24や4.13では大丈夫ですか?
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
konisi様、OverTaker様、NoWest様返信ありがとうございます。
メインスレッドでは
ウィンドウメッセージスレッドはふつうにRADツールでつくって、先ほどのコードを足したものです。
多分自分が実験した結果では、①で呼び出した再描画要求で描画されるまでにTextOut などでaDCを参照してしまい。
OverTaker様が言われました「アクセスするタイミングが衝突してしまう問題」になってしまうと思うのです。
まずは、クリティカルセクションなるものを調べようと思います。
返答ありがとうございました。[/code]
メインスレッドでは
コード: 全て選択
InvalidateRect(hMainWnd,ByVal 0,0)---①
---500行くらいコードがある---(この間aDCは関係なし)
②
BitBlt(cDC,0,0,MX+1,101,aDC,0,MY-100,SRCCOPY)
SelectObject(aDC,hPenb)
SelectObject(aDC,brh)
Rectangle(aDC,30,MY-100,MX-30,MY-30)
TextOut(aDC,50,MY-80,i,lstrlen(i))
InvalidateRect(hMainWnd,ByVal 0,0)
多分自分が実験した結果では、①で呼び出した再描画要求で描画されるまでにTextOut などでaDCを参照してしまい。
OverTaker様が言われました「アクセスするタイミングが衝突してしまう問題」になってしまうと思うのです。
まずは、クリティカルセクションなるものを調べようと思います。
返答ありがとうございました。[/code]
aDCの宣言部の上下付近に配列で宣言されている物はありませんか?
例えば、次のようなコードが書かれている場合には変数aは実行コード内では上書きされています。
あなたのコードを見た限りでは単独スレッドのようなので、これの可能性があるのではないかなと思ったんですが。
例えば、次のようなコードが書かれている場合には変数aは実行コード内では上書きされています。
コード: 全て選択
Dim a As Long,b(100) As Long,i As Long
i=-1
Do
b(i)=i
i++
If i=100 then Exit Do
Loop
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。