トップページ > 記事閲覧
フォントのリロード時に発生するハングについて
名前:uncle 日時: 2024/11/13 02:45

お世話になっております。 レアケースではあるのですが、 フォントの読み込み(非同期)中に破棄(同期)が行われた際にハングするようです。 確認した所、 static int SubHandleBase( HANDLEMANAGE *HandleManage, HANDLEINFO *HandleInfo ) の #ifndef DX_NON_ASYNCLOAD #endif で囲まれた部分(DxHandle.cpp 292周辺)なのですが、 // クリティカルセクションの解放 CriticalSection_Unlock( &HandleManage->CriticalSection ) ; でカウンタをデクリメントしていると思うのですが、 呼び出し元の extern int SubHandle( int Handle, int ASyncLoadFlag, int ASyncThread ) でもロックが行われている為、実際にはロックされたままになっているようです。 その結果、他スレッドのフォント生成処理が止まったままになる事でwhileのループから抜けられない、という状況のようです。 一先ず手元で呼び出し元の > { > // 非同期実行希望や別スレッドからの呼び出しではない場合は即座に削除 > if( SubHandleBase( HandleManage, HandleInfo ) < 0 ) > { > // クリティカルセクションの解放 > CriticalSection_Unlock( &HandleManage->CriticalSection ) ; > > return -1 ; > } > } を、 > { > // クリティカルセクションの解放 ←※追加 > CriticalSection_Unlock( &HandleManage->CriticalSection ) ; > // 非同期実行希望や別スレッドからの呼び出しではない場合は即座に削除 > if( SubHandleBase( HandleManage, HandleInfo ) < 0 ) > { >// // クリティカルセクションの解放 ←※コメントアウト >// CriticalSection_Unlock( &HandleManage->CriticalSection ) ; > > return -1 ; > } > // クリティカルセクションの取得 ←※追加 > CRITICALSECTION_LOCK( &HandleManage->CriticalSection ) ; > } とする事で解消されることを確認しております。 (基本的にASyncLoadCountが0かのチェック、もしくはUnlockしてから呼ぶようにされているので恐らくここの修正だけで大丈夫だとは思うのですが・・・・。) ご確認よろしくお願いいたしますm(_ _)m
メンテ

Page: 1 |

Re: フォントのリロード時に発生するハングについて ( No.1 )
名前:管理人 日時:2024/11/13 23:13

原因の解説から解決案までご提示いただきありがとうございます お陰ですぐに修正できました ( 修正後のソースはご提示頂いた内容よりももう少し手を加える形にしました ) 修正版をこちらにアップしましたので、よろしければお試しください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 12 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: フォントのリロード時に発生するハングについて ( No.2 )
名前:uncle(解決済み) 日時:2024/11/14 01:17

ありがとうございます! 無事、発生しなくなった事を確認できましたm(_ _)m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存