ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

プログラミング

MozJpegGUIの更新: ベンチマーキング

メタデータコピーによる変換時間増加量がどの程度のものなのか、ベンチマークをとってみた。 計測対象624枚のpngファイル (計1GB); SSDに保存 結果メタデータのコピーなし:59.462秒メタデータのコピーあり:60.213秒すなわち、0.751秒の増加。png1枚あたり1…

MozJpegGUIの更新: 残ってるTODO

そうだ、忘れないうちにToDoを書いておかないと。 TODO: 新規追加した箇所について、エラーメッセージの多言語化 元画像がJPEGだった場合はGDI+によるメタデータコピーをしない メタデータコピーのチェックボックスを消す(常時コピーする)

MozJpegGUIの更新: とりあえずGDI+でお茶を濁す

前回書いた通り、PNG/JPEG間にはメタデータ互換性がまったく無いことがわかった。となると、変換が必須だ。そして、自前で書くのは間違いなく難しい。そこで、車輪の再発明はせずに既存のものを使うことにする。候補は2つ。 GDI+のImageクラスおよびその派生…

MozJpegGUIの更新: そもそもPNGとJPGでメタデータの互換性がない!?

githubのissueに、メタデータのコピーに失敗するPNGのサンプルがアップロードされた。 github.com そこで、さっそく解析ソフトを作って、どんなメタデータがコピーできていないのかを調べてみた。そして絶望した。 PNGにおいて、画像を含む各種データはチャ…

MozJpegGUIの更新

MozJpegGUIの更新に着手。目標は、 使っている各種ライブラリのバージョンアップ https://github.com/nibasya/MozjpegGUI/issues/1 zlib 1.2.11 -> 1.3 libpng 1637 -> 1640 mozjpeg 3.3.1 -> 4.1.1 メタデータの維持 Copy metadata when converting images …

mozjpegをつかった画像変換ソフトの開発 その9 MozJPEG2.3.1->4.1.1

MozJPEGがいつのまにか3.3.1から4.1.1に進化しており、GitHubにて対応要望が出ていた。そこで、開発を再開し4.1.1を適用しようとおもう。できたらいいな。

CSimpleLock::IsLockedの罠

CriticalSectionの取り扱いを楽にするため、MFCのCCriticalSectionとCSimpleLockを使おうとして罠にハマったという話。 CCriticalSectionはCSemaphore等と異なりLock待ちのタイムアウトができない。そのため、ロックできなかったら諦める!という実装が不可…

MozJpegGUI Version 1.3リリース

高品質なJPEG画像を生成してくれるMozJpegライブラリをマルチスレッド化して高速化したWindows用ツール、MozJpegGUIのVersion 1.3をリリース。 修正点は以下の通り。 元ファイルと同じ場所にファイルを保存する機能を追加。英語版においてGUIの文字が一部隠…

C++REST (cpprest)をスタティック構成のMFCと一緒に使う

RedmineのデータをREST API経由でダウンロードするプログラムを作るためにcpprestを導入しようとした際に苦労した点のメモ。 前記ソフトをMFCランタイムをダウンロードできない/しづらい環境でも使えるようにするため、MFCをスタティックライブラリとして組…

CANUSB APIのメモ

車載ネットワークとしてよく使われているCAN信号をUSB経由でPCに取り込むツールの一つであるLAWICL社のCANUSBについて、CANUSB dllを使用した場合のメモというか愚痴をいくつか。 マニュアル誤記 マニュアル Version 0.1.8には以下の誤記がある。 int setRec…

MozJpegGUI Version 1.2リリース

高品質なJPEG画像を生成してくれるMozJpegライブラリをマルチスレッド化して高速化したWindows用ツール、MozJpegGUIのVersion 1.2をリリース。 修正点は以下の通り。 バグ修正:ファイル名に空白文字が含まれる場合、正しくないファイル名で保存してしまう …

CO2miniGUI Ver.1.1 リリース

PCにUSB接続したCUSTOM社製の二酸化炭素濃度計CO2-miniと通信し、値をPC上に表示・データ保存可能なWIndows用ソフト「CO2miniGUI」のバージョン1.1をリリース。 変更点: 英語・日本語両対応にした。 華氏表示にも対応させた。 なお以前GitHubにて公開してい…

Factorioでアイテム生産に必要な工場の数を試算するツール(FactorioFactoryCalculator)

Factorioでアイテム生産に必要な工場の数を試算するためのツール, FactorioFactoryCalculatorを公開しました。これを使えば、例えば製造サイエンスパックを毎秒3個作るために必要な、生産力モジュール1の工場の数やそのための発展基板工場の数などが試算でき…

重い処理中にステータス(状態)を表示するダイアログの実装(ユーザーインターフェーススレッド)

解決したい課題 MFCを使ったソフトにおいて重い処理をしている最中に、進捗等を表示するダイアログを表示したくなることは多々ある。しかし、単純にダイアログを作って表示しようとしても、以下のようにうまく行かないことが多い。 重い処理が終わるまでダイ…

重いイベントハンドラの処理状況をダイアログで表示する

背景 重い処理の進捗状況をダイアログで表示する場合、自分がよくやるのは 進捗状況を示すモードレスダイアログを作成 重い処理をAfxBeginThread()により別のワーカースレッドとして起動 モードレスダイアログは適宜タイマによって状況を更新 モードレスダイ…

CListViewにポップアップメニューを追加したけどON_UPDATE_COMMAND_UIが送られてこない件について

事象 CListViewにポップアップメニューを追加し、条件に応じてメニューのEnable/Disableを切り替えようとMFCの流儀に則りON_UPDATE_COMMAND_UIのハンドラを追加した。しかし、ポップアップメニュー表示時になぜかON_UPDATE_COMMAND_UIが来ない。 原因 CListV…

ダイアログバー上のエディットボックスから文字列を取得する方法

ダイアログバー上のエディットボックスから文字列を取得するのにちょっと苦労したのでメモ。 問題の背景 ダイアログを作る場合、通常はCDialog等を継承した、そのダイアログ固有のクラスを作成する。しかしMicrosoft曰く、CDialogBarは通常固有のクラスを作…

mozjpegをつかった画像変換ソフトの開発 その8

mozjpegを多並列で実行するGUIを備えた画像変換ソフト、無事Vectorにて公開。 www.vector.co.jp そのうち、英語版もどこかで公開予定だけど、どこにしよう?Vectorってどう見ても国内オンリーなのよね。英語ページを作れる気がしない。 2020/04/24追記 githu…

CDocumentからCViewを取得する一例

今時ドキュメントビューアーキテクチャなんて人は居ないだろうけど、メモ。 CDocumentからCViewにメッセージを投げたいときや関数を直接呼び出したいときに困るのが、CViewのアドレス取得方法。特に、自分はCSplitterWndを多用したためCViewが複数あり決め打…

CArchive::ReadString, CArchive::WriteStringの罠

CArchive::ReadString()とCArchive::WriteString()を使って文字列を読み書きしようとしたら文字化けしてハマったのでメモ。 以下のようなコードを書いたら、読み込み時に文字化けした。 void Serialize(CArchive &ar){ TCHAR path[MAX_PATH+1]; if(ar.IsStor…

リソースエディタがWS_EX_COMPOSITEDを認識しない

とあるリソースをVisual Studio2019で開こうとしたら、error RC2104: undefined keyword or key name: WS_EX_COMPOSITED というエラーが出た。 error RC2104: undefined keyword or key name: WS_EX_COMPOSITED でも、おかしい。このキーワードはWindowsに存…

mozjpegをつかった画像変換ソフトの開発 その7

mozjpegを使った画像変換ソフト、開発が一段落した。 以下に121個のpngファイルを処理した場合の例を示す。64bit版では約6秒で全ファイルの処理が終わった。 MozJpegGUI 64bit ver. example なお、32bit版と64bit版を作ったが処理速度は以下のように64bit版…

_RPTN, _RPTWN等をTCHARに対応させる

Visual Studioの出力ウィンドウに文字を出力する_RPT系関数は便利だが、なぜかTCHAR版が無い。 (_RPT系関数の参考) donadona.hatenablog.jp 仕方ないので、TCHAR版を作ってみた。なお、毎回_CRT_WARNを書くのが面倒だったので入力不要としている。別のもの…

CMultiLockの問題

Semaphoreの参照カウント数を知るために、カウント数を保持するクラスを作ってみたのだがうまくカウントしてくれない。原因を調べるために、CMultiLockのコードを読んでみたらびっくりした。Unlock()とかはCSyncObjectクラスのUnlock()を呼び出すようになっ…

CEventとCMultiLock::IsLocked

CEventとCMultiLock::IsLocked()の組み合わせでちょっと悩んだのでメモ。 CSemaphoreオブジェクトAのLock待ち中にAbortできるよう、以下のように組んだ。 悩んだのは、IsLocked()。Microsoftのドキュメントでは"Nonzero if the specified object is locked; …

Visual Studioのコード上で32bit用コードと64bit用コードを切り替える

Visual StudioにてC / C++のプログラミングをする際に、32bit向けと64bit向けでコードを変えたくなる場合がある。切り替え自体は当然#ifdefでやるのだが、どの定数で判定するのが良いのだろうか?以下、整理してみた。情報ソースはマイクロソフトの以下記事…

Visual Studioでクラスが登録されていませんというエラーが出る

Visual Studioのリソースエディタで、ダイアログのクラスを追加しようとして「クラスの追加」を選び必要事項を入力したら、「クラスが登録されていません」というエラーがでてしまった。 クラスが登録されていません 直接の原因はわからないが、適切なプロジ…

mozjpegをつかった画像変換ソフトの開発 その6

マルチスレッド関連の実装方法に迷いが生じたので、ちょっと考えを整理する。 ■やりたいことは何か やりたいことはスレッドからスレッドへの通知?いや違う。それは手段であって、目的ではない。やりたいのは、 処理Aが終了したあと、その結果を使う処理Bを…

SendMessage / PostMessageにかかる時間

SendMessageやPostMessageにてメッセージを投げてから受け取るまでにかかる時間を調べてみた。Ryzen3700X @ Windows10 Prof. 1909では、SendMessage: 20us, PostMessage: 34usだった。SendMessageのほうが早いのは、WindowProcedureを速やかに呼ぶかららしい…

mozjpegをつかった画像変換ソフトの開発 その5

どういうふうにスレッドの制御をするか考え中。今回のソフトは、タスクごとにスレッドを作ってしまうという富豪方針である。ということは、リソースに見合った数のスレッドが常に走っているようにスレッドを生成し続ければよい。これを実現するには、ワーカ…