mozjpegをつかった画像変換ソフトの開発 その4
どのようにマルチスレッド化するかを考え中。考えられる方針は大きく2つ。ファイルを1個開くたびに1スレッド作り、1変換をするたびに1スレッドを作り、1個書き出すたびに1スレッド作る。ブルジョワ方針。物理メディアごとに1スレッド作り、当該メディアで読み書きするファイルはすべてそのスレッドで処理。CPUコアごとに1スレッド作り、当該コアで処理するデータは(略)。けちんぼ方針。2.のほうがかっこいい実装だし...
View Articlemozjpegをつかった画像変換ソフトの開発 その5
どういうふうにスレッドの制御をするか考え中。今回のソフトは、タスクごとにスレッドを作ってしまうという富豪方針である。ということは、リソースに見合った数のスレッドが常に走っているようにスレッドを生成し続ければよい。これを実現するには、ワーカースレッドが完了した際には制御クラスに通知する必要がある。通知は、いくつかの方法がある。一つはSendMessage /...
View ArticleSendMessage / PostMessageにかかる時間
SendMessageやPostMessageにてメッセージを投げてから受け取るまでにかかる時間を調べてみた。Ryzen3700X @ Windows10 Prof. 1909では、SendMessage: 20us, PostMessage:...
View Articlemozjpegをつかった画像変換ソフトの開発 その6
マルチスレッド関連の実装方法に迷いが生じたので、ちょっと考えを整理する。■やりたいことは何かやりたいことはスレッドからスレッドへの通知?いや違う。それは手段であって、目的ではない。やりたいのは、処理Aが終了したあと、その結果を使う処理Bを起動する処理Aが終了したあと、次の同様の処理A'を起動する処理A'、処理Bはリソースが空くまで動作しないである。つまり条件付きで処理を開始したい、ということになる。...
View ArticleVisual Studioでクラスが登録されていませんというエラーが出る
Visual Studioのリソースエディタで、ダイアログのクラスを追加しようとして「クラスの追加」を選び必要事項を入力したら、「クラスが登録されていません」というエラーがでてしまった。クラスが登録されていません直接の原因はわからないが、適切なプロジェクトをスタートアッププロジェクトに設定したら治った。ちなみに、英語環境だと以下のエラーになる。Error HRESULT E_FAIL has...
View ArticleVisual Studioのコード上で32bit用コードと64bit用コードを切り替える
Visual StudioにてC / C++のプログラミングをする際に、32bit向けと64bit向けでコードを変えたくなる場合がある。切り替え自体は当然#ifdefでやるのだが、どの定数で判定するのが良いのだろうか?以下、整理してみた。情報ソースはマイクロソフトの以下記事。docs.microsoft.com_WIN32x86, x64, 32bitARM,...
View ArticleCEventとCMultiLock::IsLocked
CEventとCMultiLock::IsLocked()の組み合わせでちょっと悩んだのでメモ。CSemaphoreオブジェクトAのLock待ち中にAbortできるよう、以下のように組んだ。悩んだのは、IsLocked()。Microsoftのドキュメントでは"Nonzero if the specified object is locked; otherwise 0."...
View ArticleCMultiLockの問題
Semaphoreの参照カウント数を知るために、カウント数を保持するクラスを作ってみたのだがうまくカウントしてくれない。原因を調べるために、CMultiLockのコードを読んでみたらびっくりした。Unlock()とかはCSyncObjectクラスのUnlock()を呼び出すようになっているのに。Lock()は直接Win32APIを叩きに行っていて、CSyncObjectのLock()を呼んでいない。...
View Article_RPTN, _RPTWN等をTCHARに対応させる
Visual Studioの出力ウィンドウに文字を出力する_RPT系関数は便利だが、なぜかTCHAR版が無い。(_RPT系関数の参考)donadona.hatenablog.jp仕方ないので、TCHAR版を作ってみた。なお、毎回_CRT_WARNを書くのが面倒だったので入力不要としている。別のものを指定したい場合は、適宜書き換えてください。TCHAR version of _RPTN...
View Articlemozjpegをつかった画像変換ソフトの開発 その7
mozjpegを使った画像変換ソフト、開発が一段落した。以下に121個のpngファイルを処理した場合の例を示す。64bit版では約6秒で全ファイルの処理が終わった。MozJpegGUI 64bit ver....
View ArticleリソースエディタがWS_EX_COMPOSITEDを認識しない
とあるリソースをVisual Studio2019で開こうとしたら、error RC2104: undefined keyword or key name: WS_EX_COMPOSITED というエラーが出た。error RC2104: undefined keyword or key name:...
View ArticleCArchive::ReadString, CArchive::WriteStringの罠
CArchive::ReadString()とCArchive::WriteString()を使って文字列を読み書きしようとしたら文字化けしてハマったのでメモ。以下のようなコードを書いたら、読み込み時に文字化けした。 void Serialize(CArchive &ar){ TCHAR path[MAX_PATH+1]; if(ar.IsStoring()){ // save (中略)...
View ArticleCDocumentからCViewを取得する一例
今時ドキュメントビューアーキテクチャなんて人は居ないだろうけど、メモ。CDocumentからCViewにメッセージを投げたいときや関数を直接呼び出したいときに困るのが、CViewのアドレス取得方法。特に、自分はCSplitterWndを多用したためCViewが複数あり決め打ち取得ができなずに困ってしまった。そこで以下のような簡単なコードを書いてみた。Example of finding CView...
View Articlemozjpegをつかった画像変換ソフトの開発 その8
mozjpegを使った画像変換ソフト、無事Vectorにて公開。www.vector.co.jp そのうち、英語版もどこかで公開予定だけど、どこにしよう?Vectorってどう見ても国内オンリーなのよね。英語ページを作れる気がしない。
View Articleダイアログバー上のエディットボックスから文字列を取得する方法
ダイアログバー上のエディットボックスから文字列を取得するのにちょっと苦労したのでメモ。問題の背景ダイアログを作る場合、通常はCDialog等を継承した、そのダイアログ固有のクラスを作成する。しかしMicrosoft曰く、CDialogBarは通常固有のクラスを作成しないらしい。これは、ダイアログバーはメインウィンドウの一部で、各コントロールからのメッセージはメインウィンドウのウィンドウプロシージャで...
View ArticleCListViewにポップアップメニューを追加したけどON_UPDATE_COMMAND_UIが送られてこない件について
事象CListViewにポップアップメニューを追加し、条件に応じてメニューのEnable/Disableを切り替えようとMFCの流儀に則りON_UPDATE_COMMAND_UIのハンドラを追加した。しかし、ポップアップメニュー表示時になぜかON_UPDATE_COMMAND_UIが来ない。原因CListViewは、ON_UPDATE_COMMAND_UIの送信に必要なOnInitMenuPopup...
View Article重いイベントハンドラの処理状況をダイアログで表示する
背景重い処理の進捗状況をダイアログで表示する場合、自分がよくやるのは進捗状況を示すモードレスダイアログを作成重い処理をAfxBeginThread()により別のワーカースレッドとして起動モードレスダイアログは適宜タイマによって状況を更新モードレスダイアログ上のキャンセルボタンが押された場合はフラグを立てる重い処理内では適宜フラグを監視し必要に応じて処理を中断するというもの。たいていはこれで問題なく動...
View ArticleガンダムオンラインのCPU使用率およびGPU使用率
ガンダムオンラインにおけるCPU使用率とGPU使用率をメモ。CPUはRyzen3700X, GPUはGeForce GTX 1070、解像度は1920×1080で画質は最高。全ていずれもCPU使用率20%程度、GPU使用率20%程度。CPU使用率の波形から、相変わらず2スレッドぐらいしか使っておらずマルチコアよりも高クロックの方が快適度の高い設計に見える。ロビー:ガンダムオンライン...
View Articleガンダムオンラインで回復ビームが他人から見えないことがあるバグ
ガンオンで死体を起こそうと回復ビームを当ててたら、それを遮って修理しろアピールをする人がいた。何故だろうと思ってリプレイを見てみたら、回復ビームが写っていない!そりゃ、死体を起こそうとしているのは分からないし、修理アピールもするわ。以下、リプレイによる検証動画。回復ビームが出ていた証拠に死体は無事復活したし、復帰ポイントも入っている。なので、自分がビームを出していたのは間違いない。しかし、リプレイで...
View Article