« 2015年1月 | トップページ | 2015年3月 »

2015年2月

2015年2月27日 (金)

Windows10 Technology Previewで試す

テストのためインストールしていたWindows10 (Tecnology Preview)を使ってインストールテストを行いました。

ドキュメントの改行コードがLFになっていてメモ帳で正しく改行されないという不具合はありましたが、
Windows10ではVisual C++ 2010 x86 Redistributableは必要ないようですね。

あとMinGWのdllのstatic link忘れがありました…

-static-libgcc -static-libstdc++

をリンク時に付け忘れてました…

static linkにすべきか否か…悩む所です。

20150227_110342

2015年2月25日 (水)

お試し用の簡易ドキュメントの作成とQt5.4.1でのビルド

お試しで使ってもらうパッケージとドキュメントを準備していたらQtが5.4.1にマイナー(?)バージョンアップしました。

Windowsでのstaticリンク用のQt5.4.1を作り直して、パッケージを作り直しました。
直前のバージョンアップが影響する可能性もありますが、評価用なのでこのバージョンアップも含めてテストしてみたいと思います。

サイズはこんな感じでした。

[Ubuntu 14.04 LTS x64 用]

qtbrynhildr-ubuntu1404_x64-v026-20150225.tar.xz : 58KB

Screenshot_2

[Windows7/8/8.1 32bit/64bit用]

qtbrynhildr-windows-v026-20150225.exe : 14,836KB (brynhildrのおよそ100倍…)

20150225_223907

さて最後のドキュメントチェックを…


推敲前ドキュメントを載せておきます。
(なんとなく雰囲気が掴めるかな…と思いまして…そんなに読む人いないかヽ(´▽`)/)

-------------------------------------------------------------------------------
!!!!!!!!!!動作確認版のため完全無保証、再配布禁止です。!!!!!!!!!!
(*) 開発中のソフトウェアですので、重要な作業には不向きです。
安定性、使い勝手向上のためにご協力をお願いします。

----------------------------------------------------------------------
Qt Brynhildr (仮称) について
----------------------------------------------------------------------
==============================
[最初に]
==============================
このソフトウェアは仕様の公開されているパブリックモードで動作させた
Brynhildrサーバに接続するためのクライアントソフトです。

サーバ機能は持っていませんので、サーバとしてはBrynhildrをご利用ください。

また、公開されているパブリックモードでは現状ファイルの送受信、クリップボードの
共有はできない仕様になっていますので、これらの機能が必要な場合はBrynhildrの
クライアントモードをご利用ください。

(*) Brynhildrの標準のクライアントモードに対して大きなアドバンテージがある
クライアントではありませんのでご承知おきください。
このソフトウェアはより多くの環境でリモートコントロール機能を利用できるように
することを主たる目的としています。(あと作者の勉強のため…)

このドキュメントはすでにBrynhildrによるリモートデスクトップ環境を構築済みの方の
利用を想定しています。

==============================
[対応予定OS]
==============================

Windows 7 (32bit/64bit)
Windows 8 (32bit/64bit)
Windows 8.1 (32bit/64bit)

Ubuntu 14.04 LTS以降 (32bit/64bit)

(*1) 全てのエディションで試したわけではありません。
現在確認済みの環境はWindows8.1update (x64)とUbuntu 14.04 LTS (x64)のみです。
XP(32bit), Vista(32bit/64bit)は未定です。

(*2) Qt5のサポートする環境(OS)で動作させられたらいいなぁと思っていますが、
お約束は出来ません。
例えばMac, iOS, Android, Windows Phoneなどなどですが…

Qt5のサポートする環境(OS)について詳しくは以下のページを御覧ください。
http://doc.qt.io/QtSupportedPlatforms/index.html

----------------------------------------------------------------------
1-1. インストール (Windows)
----------------------------------------------------------------------
==============================
[インストール]
==============================

インストーラを実行してインストールしてください。設定はデフォルトのままを
お勧めします。

==============================
[アンインストール]
==============================

「コントロールパネル」->「プログラムと機能」からアンインストールしてください。
レジストリは自動的に削除され、インストールされたすべてのファイルも削除されます。

不安な場合はレジストリエディタで"mcz-xoxo"という名前のエントリを検索してください。
アンインストール後も上記レジストリが存在した場合はお手数ですが手動で削除してください。

----------------------------------------------------------------------
1-2. インストール (Ubuntu 14.04 LTS x64)
----------------------------------------------------------------------
==============================
[インストール]
==============================

1) Qt5をインストールします。

http://download.qt-project.org/official_releases/qt/5.4/5.4.1/qt-opensource-linux-x64-5.4.1.run

パーミッションを確認してroot権限で実行してください、インストーラが表示されます。

例)

chmod 755 ./qt-opensource-linux-x64-5.4.1.run
sudo qt-opensource-linux-x64-5.4.1.run

2) libglu1-mesa-dev パッケージをインストールします。

sudo apt-get install libglu1-mesa-dev

3) バイナリを解凍します。

tar xvfJ

4) 起動確認します。

./dist_ubuntu_x64/bin/qtbrynhildr

5) 起動して、エラーが出たら、必要なパッケージをインストールして、4)へ戻ります。

==============================
[アンインストール]
==============================

1) 以下を削除してください。

~/.config/mcz-xoxoとdist_ubuntu_x64以下

2) 気になる人は以下もアンインストールしてください。

Qt5, libglu1-mesa-dev

----------------------------------------------------------------------
2. Brynhildrサーバの準備 (パブリックモードの有効化)
----------------------------------------------------------------------

(1) サーバを実行中の場合は一旦サーバを終了させてください。

(2) brynhildr.exeと同じフォルダーにあるbrynhildr.iniをエディタで開きます。

(3) [ServerMode]セクションにある以下の設定を変更して保存します。

publicmode=0 -> publicmode=1

(4) brynhildr.exeをサーバモードで再起動します。
これでパブリックモードが有効となります。

(*) 動作確認後は念のため元の設定に戻すことをお勧めします。

(*) 確認の為Brynhildrサーバのログを出力させておくことをお勧めします。
brynhildr.exeと同じフォルダにlog.txtというファイルを作成しておけば
出力されるそうです。

----------------------------------------------------------------------
3. Qt Brynhildr の動作確認
----------------------------------------------------------------------

==============================
サーバへの接続
==============================

(1) Windowsの場合はデスクトップのショートカットをダブルクリックしてQt Brynhildrを
起動してください。Ubuntuの場合は端末から起動してください。

(2) 「ファイル」メニューから「接続」を選んで、「サーバに接続ダイアログ」を
表示してください。

(3) 必要な情報を入力してください。

[1] 「ホスト名/IPアドレス」

サーバ名もしくはIPアドレスを指定してください。

[2] 「ホストタイプ」

サーバOSを選択してください。

[3] 「キーボードタイプ」

サーバのキーボードタイプ(JP Keyboard(日本語キーボード)もしくは
US Keyboard(英語キーボード))を選択してください。
(英語キーボードはテストが十分ではありません…)

[4] 「ポート番号」

ポート番号を指定してください。

[5] 「パスワード」

パスワードを入力してください。(現在のところパスワードは保存されません)

(4) 「OK」ボタンを押してサーバに接続してください。

==============================
サーバからの切断
==============================

(1) 終了する時は「ファイル」メニューから「終了」を選ぶか、ウィンドウの
「X」ボタンを押してください。

(2) 確認ダイアログが出るので、終了して良い場合には「OK」ボタンを押して
Qt Brynhildrを終了してください。

==============================
使い方
==============================

(1) 「ビデオ」メニュー

デスクトップ画像の画質を変更します。画質を良くするとデスクトップ画面の
更新が粗くなり、画質を低くすると比較的デスクトップ画面の更新がスムーズに
なります。

(2) 「サウンド」メニュー

サウンドの音質を変更します。周波数を変更することで転送するデータ量を
減らすことが出来ます。音質が変わらない場合もあります。

(3) 「コントロール」メニュー

[1] キーを送る

以下の特殊キー(の組み合わせ)をサーバに送ります。

(1) ALT キー + F4 キー

(2) CTRL キー + ESC キー

(3) Windows キー

[2] コントロール ON/OFF

入力デバイス情報転送のON/OFFを変更します。OFFにするとキーボード/マウスの
動きがサーバに送られません。
サーバ画面の監視だけをしたい時にOFFにすればよいかもしれません。

[3] グラフィックス ON/OFF

デスクトップ画像転送のON/OFFを変更します。OFFにするとデスクトップ画像が
更新されません。

[4] サウンド ON/OFF

サウンド情報転送のON/OFFを変更します。OFFにするとサウンド情報が
転送されないため消音状態になります。

(4) 「オプション」メニュー

[1] デバッグログ出力 ON/OFF

デバッグログ出力のON/OFFを変更します。デバッグ用の機能で将来残るかは
未定です。

書き込み可能な場所ならインストールしたフォルダ直下にログファイルを
作成し保存します。
設定によっては各ユーザフォルダの下に作成されることもあります。
([不具合と未実装]を参考のこと)

(5) 「ヘルプ」メニュー

[1] Qt Brynhildr について

Qt Brynhildr についてバージョン情報などを表示します。

----------------------------------------------------------------------
[Note]
----------------------------------------------------------------------
Visual C++ 2010 x86 Redistributableが必要です。

インストールしたフォルダQtBrynhildr\vcredistの下にありますので
必要ならインストール後Windows Updateで最新に更新してください。
デスクトップにショートカットがあります。

(*) この説明で、わからない人はもう少しお待ちください。

----------------------------------------------------------------------
メッセージダイアログについて
----------------------------------------------------------------------
(1) 「Please check server sound device!」

サーバのサウンド設定の変更が必要かもしれません。
サーバのサウンドの再生デバイスプロパティのスピーカー周波数を

「16ビット、44100Hz(CDの音質)」

に変更すれば改善されるかもしれません。

(2) 「Failed to connect server!」

サーバに接続できませんでした。
ホスト名もしくはIPアドレスが間違えているかもしれません。

(3) 「Password Error!」

パスワードが間違えているかもしれません。

----------------------------------------------------------------------
[不具合と未実装]
----------------------------------------------------------------------
(1) インストールフォルダにログファイルが作成されない
UACのため出力先が強制変更されている
C:\Users\ユーザ名\AppData\Local\VirtualStore\Program Files (x86)\QtBrynhildr\qtbrynhildr.log

(2) フォーカスが無い時もマウス情報が有効となっている
(フォーカスが無い時は無効の方がよいのでは?)

----------------------------------------------------------------------
不具合の報告について
----------------------------------------------------------------------
以下にお願いします。

ふんふん(FunFun) : xxxxxxxx@gmail.com

提供して頂きたい情報は以下のような情報です。

1) サーバマシン/クライアントマシンそれぞれについて

[1] OS名

[2] 32bit/64bit

[3] サービスパックの適用(ServicePack/update) [Windows]

[4] 接続形態 (LAN/WAN)

2) Brynhildrサーバについて

[1] お使いのBrynhildrのバージョン

[2] 不具合発生時のlog.txtの内容
(brynhildr.exeと同じ場所に空の"log.txt"を作成する必要があります)

3) Qt Brynhildrについて

[1] お使いのQt Brynhildrのバージョン

[2] 不具合発生時のqtbrynhildr.logの内容

4) 不具合内容

5) 再現手順

----------------------------------------------------------------------
開発日誌は以下のページにあります。
(内容は開発過程に興味のある方向けです)

http://xxxxxxxx.cocolog-nifty.com/blog/

ある程度安定したらソースコードを公開する予定です。
----------------------------------------------------------------------

2015年2月24日 (火)

Qt Creatorを使ってみる

IDEはあまり得意ではないので、これまで基本的にエディタ+makeで開発していました。
ソースコードの整理をしていて、ふと思いつきでQt Creatorを使ってみました。

念のためソースコードをまるごとコピーして、Qt Creatorを起動後「プロジェクトを開く」で"qtbrynhildr.pro"を
読み込みました。

20150224_172628

今まで1つ1つ手で起動していたDesignerとかLinguistとかもIDEからお手軽に使えるようです。
とりあえずビルドから起動、デバッグまで手直しなしでいけました。

ちょっと暇を見つけて使ってみようかなと思います。

2015年2月22日 (日)

cygwinのmakeが4.1になりました

qmakeが作成するMakefileがcygwinのmake 4.0だとそのままで使えないのでmingw32-makeを使っていましたが、ようやく最近cygwinのmakeも4.1になりました。

ので、普通にmakeでビルドできます。ブログの最初のほうで設定したalias(mmake)を削除しました。

2015年2月21日 (土)

Qt Brynhildr (仮称) (パブリックモード対応Brynhildrクライアント)

Ubuntu 14.04 LTS (x64)へのポーティング作業が一通り終わりました。

対応したプラットフォームは恐らく以下のとおりです。


Windows7以降(7/8/8.1) (32bit/64bit)

Ubuntu 14.04 LTS (32bit/64bit) (14.10も大丈夫かも)


Qt5のサポートされたデスクトップを持つ環境(Macなど)なら、多少の手直しで対応できる…かも…。

iOS/Androidは入力デバイス部分の対応が必要そう…です。デュアルコア以上が必要な気もします。

先日入手したクアッドコアなRaspberry Pi 2で試してみたいなぁと思います。

Ubuntu 14.04 LTS (64bit) Test Movie

このブログを書き始めて一年も経ってしまいました…(*^-^)

2015年2月20日 (金)

Ubuntu 14.04 LTS (x64)へポートしてみました

何となく興味が出たので、Linux (Ubuntu 14.04 LTS x64)へ移植してみました。

基本的にはWinSock依存部分を通常のBSD socketへ変更するだけです。
(というか本来逆のような気もしますが…)

20150220_173100

少々要検討な部分もありますが、まぁ基本的には動いてます。音も出るし(^_^;

以下の様なテスト環境です。

サーバ: Windows 7 Home (x64) Brynhildr 1.0.7

クライアント: Ubuntu 14.04 LTS x64 日本語Remix版 (カーネルは今朝ビルドした3.18.7、Qtは5.4.0)

(*) VMware Workstation上のUbuntu…ですが。

テスト動画

Ubuntu のパッケージはどうやって作るんでしょうか…そのうち勉強しよう…

2015年2月19日 (木)

進捗記録 2015.2.19

進捗記録

Ver 0.26-rc3 Windows (32bit) static link版

使用メモリはbrynhildrの半分だけどバイナリサイズは100倍…

クライアント Windows8.1update, サーバ Windows XP(VMware)

2015年2月18日 (水)

それでも落ちますけど…

Qtを最新にしたらO.K.…なわけはありませんでした、やっぱり。

落ちる頻度は低くなったものの、落ちる時は落ちます。ウィンドウの再描画のタイミングが悪いと落ちるようです。

仕方がないので、Qt5のソースコードをダウンロードして少し眺めてみました。

その時なんとなく思いついたのが、Qtの画像データはスレッドセーフなのか、という疑問でした。

googleさんで検索すると結構な数のページが表示されました(;ω;)

前回の対処でJPEGデータを読み込む所と表示するところを排他制御しようとしましたが、そこを制御するだけではだめだったのでした…

GUIスレッドとMotionJPEGを受け取るスレッドで各々ローカルにQImageを持ちsignal/slotで接続した先のGUIスレッドの関数でコピーするとデータが破綻しなくなる、ということみたいです。

2015年2月14日 (土)

ログファイルの行方

お試しで使ってもらうためにインストーラパッケージを作成しました。

まだまだ不安定なので不具合の原因を確認するために出来る限り多くの動作情報(ログ)を出しておきたいです。
このため実行時に現在のパス(カレントパス)を取得して、そこにログファイルを出力しています。

ところが実際にインストールしてショートカットから実行してもインストール先にはログファイルが作成されません。

ここまで書けば、お気づきの方が多いかもしれませんが…

インストーラの初期設定ではProgram Files (x86)の下にインストールされます。私はUACの設定をONにしているのでこのフォルダ以下はWindowsさんによって保護されていて、ファイルの作成場所が強制的に変更されてしまいます。
ま、確かにアプリケーションのインストールフォルダに各ユーザが勝手にファイルを作るとマズイですよね。

標準的な設定だと

C:\Users\ユーザ名\AppData\Local\VirtualStore\Program Files (x86)\QtBrynhildr\qtbrynhildr.log

のようにユーザ毎のフォルダにログファイルが作成されます。現在のパスを指定する今の実装があまり良くないのでしょうね…ちょっと要検討でしょうか。ログファイルの出力先を指定してもらうのがよいかもしれないですね…

2015年2月12日 (木)

やっぱり落ちますけど…

QPixmapの更新/参照を排他的に行うようにlock/unlockするようにしたのですが、やはりまだ落ちます(;ω;)

QPainter.drawPixmap()の先で怪しいメモリアクセスのため落ちているのは確かのようですが、もうそこはQtのライブラリ内部だよなぁ…と半ばあきらめていたのですが…

何の気なしに、これまで使っていたQt5.3.2を最新のQt5.4.0にあげてビルドしました。というのも暫定で対応した時にALTキーを押下した時の動きがQt5.4.0になって変わっていたのでまだ様子見していたのです。

試しに起動してみたら、これが落ちないのです…恐る恐る、いろいろ試してみましたが落ちません(◎´∀`)ノ
サーバ側でFirefoxを起動してradikoにアクセスしてみましたが、普通に聴けてます。

結局のところQt5.4.0が出るまで事実上この開発中のソフトウェアは完成しなかったのかと考えると、なんとも複雑ではあるのですが…

Qtをよく知っている方なら、もっと短期間で開発できたのでしょうねぇ~
コメント/空行込みでソースコード量は7200行(156KB程度)でございます。ちなみにzerosikikai.cppは1105行です。
#Qtのお陰でこの量で済んでいるのですが。

さて、後は細々とした作業ですが…先が見えているとラクですね、開発は…
(しかし最新のQtでのみ対応というのはいろいろ問題ありそうな気がしないでもないけど…)

2015年2月10日 (火)

時々突然落ちますけど…その2

さて関数drawPixmap()ですが、画像情報を持つQPixmapのインスタンスを渡してそれを再描画する関数です。

ここでdrawPixmap()を呼んでいるのは、QMainWindowクラスのメソッドpaintEvent()で、メインウィンドウの描画が必要になると呼ばれます。このメインウィンドウはメインスレッドで実行されます。

QPixmapのインスタンスにJPEGの画像情報を設定してこれを渡すのですが、このJPEG情報を設定するのが実はグラフィック描画用のスレッド(メインスレッドとは別のスレッド)なのです。

再描画処理(paintEvent())はJPEGファイルを受け取った時だけではなく、ウィンドウの再描画が必要になった時に非同期に呼ばれるのでした…つまり、運悪く画像描画中に他のスレッドが画像のデータを書き換えたりしたら何が起こるかわからないんですね。

ということで、1つのスレッドが描画している間は、他のスレッドが使っているデータを書き換えたりしないように制御してやる必要があります。これがいわゆる排他制御ですね。シングルスレッドで実装していた昔なら問題なかったのですがスレッドに分けた時点で気づいてませんでした。

QPixmapのインスタンス内部の情報を書き換えたり、参照したりする時は他のスレッドが書き換えたり、参照できないようにします。このためにQReadWriteLockを利用します。

QReadWriteLock lock;

[JPEGデータ設定(書き込み)時] : グラフィック描画用スレッド

lock.lockForWrite();
bool imageLoadResult = pixmap->loadFromData((const uchar *)buffer,(uint)receivedDataSize);
lock.unlock();

[JPEGデータb描画(参照)時] : メインスレッド

lock.lockForRead();
QPainter painter(this);
painter.drawPixmap(0, 0, *pixmap);
lock.unlock();

ブリュンヒルデ零式改(zeroshikikai.cpp)の場合GlobalAlloc()とGlobalUnlock()で結果的に制御されているため問題なしということでしょうか。

もう少し動作確認をして、アルファテスト的なリリースパッケージを作ろうかなと思います。
#まず「パブリックモードとは」から説明するためのマニュアルが必要でしょうね…

時々突然落ちますけど…その1

では、そろそろ試用版をリリースしてみようかな、と思ったのですが…しばらく使っていると突然落ちてしまいます。
cygwinのターミナルには"Segmentation Fault"と表示されてます(^-^;

タイミング的にまちまちなので「ああスレッド関係だろうな」という感じではあるのですが、マルチスレッドプログラミングの勘がまだまだ働かないので通常のデバッグを試みました。

まず、debugバージョンの実行モジュールをビルドします。で、gdbを起動し、runを実行しました。

メインスレッド
入力デバイス(キーボード/マウス)用スレッド
グラフィックス描画用スレッド
サウンド再生用スレッド

などなどが起動されるところまでは確認できますが、WinSockによるネットワーク接続の確立で失敗します。gdbからではなく普通にdebugバージョンを起動すると接続できるので、gdb内からの実行だとWinSock関連で失敗してしまうようです。

"Segmentation Fault"が発生するのは、ネットワーク接続完了後なのでこれではデバッグできません。

いわゆるprintfデバッグも考えましたが、非常に大量のログが出ることは予想できたのでなんとかならないかなぁとgoogleさん頼みで検索していました。

探しながら気がついたのは、"Segmentation Fault"という文字列が表示されているという点です。

ということはSIGSEGVというシグナルが捕捉されていてデフォルトハンドラで文字列が表示されているということですよね。だったら、ハンドラを自分で書いて、ハンドラ内でPCレジスタをなんとかして調べられるはずだから、プログラムのどこらへんで例外が起こったのかは分かりそうだという発想でした。

早速googleさんで調べます。

"mingw catch sigsegv"

で探しだしたのがこちらのページです。優秀な技術者さんに感謝ですね。

http://spin.atomicobject.com/2013/01/13/exceptions-stack-traces-c/

こちらのページではUNIX/Linux/MinGWで例外を捕捉し、"addr2line"というユーティリティーを利用して
例外発生時のStack Traceの情報を出来る限り表示するというものです。うまくいけばソースコードのファイル名、行数を表示してくれます。

こちらにあるサンプルソースコードを自分のソースコードのmain.cppあたりにコピーして少し手直しすればそのまま使えます。但し、スタックトレースを順次表示するためにsystem()を実行するため、cygwinターミナル内で実行するとコマンドプロンプトウィンドウが開いては閉じ、開いては閉じするだけで結果が見られないので、関数addr2line()の中のsprintf()の直後にaddr2line_cmdの内容を標準出力させるように変更しました。

実際にはこの標準出力をコピペして手動で実行しました。こんな感じです。
qtbrynhildr.exeは実際はフルパスですが…(cygwinなので"/"にしてます)

#!/bin/bash
addr2line -f -p -e debug/qtbrynhildr.exe 74b2b5f0
addr2line -f -p -e debug/qtbrynhildr.exe 00c8f142
addr2line -f -p -e debug/qtbrynhildr.exe 00d5bca2
addr2line -f -p -e debug/qtbrynhildr.exe 00ce0f6f
addr2line -f -p -e debug/qtbrynhildr.exe 00ce5ce6
addr2line -f -p -e debug/qtbrynhildr.exe 00ce4ee5
addr2line -f -p -e debug/qtbrynhildr.exe 00cfb5d9
addr2line -f -p -e debug/qtbrynhildr.exe 0041cdae
addr2line -f -p -e debug/qtbrynhildr.exe 00406a61
addr2line -f -p -e debug/qtbrynhildr.exe 0a5af282
addr2line -f -p -e debug/qtbrynhildr.exe 0a6b3788
addr2line -f -p -e debug/qtbrynhildr.exe 0a6b88eb
addr2line -f -p -e debug/qtbrynhildr.exe 0a57df61
addr2line -f -p -e debug/qtbrynhildr.exe 0a57dde5
addr2line -f -p -e debug/qtbrynhildr.exe 6b929eee
addr2line -f -p -e debug/qtbrynhildr.exe 0a8c6af1
addr2line -f -p -e debug/qtbrynhildr.exe 0a5a7cfa
addr2line -f -p -e debug/qtbrynhildr.exe 0a5842fd
addr2line -f -p -e debug/qtbrynhildr.exe 0a5835dd
addr2line -f -p -e debug/qtbrynhildr.exe 0a59fc58
addr2line -f -p -e debug/qtbrynhildr.exe 0a5af7c3
addr2line -f -p -e debug/qtbrynhildr.exe 0a6cb790
addr2line -f -p -e debug/qtbrynhildr.exe 0a57df61
addr2line -f -p -e debug/qtbrynhildr.exe 0a57dde5
addr2line -f -p -e debug/qtbrynhildr.exe 6b929eee
addr2line -f -p -e debug/qtbrynhildr.exe 6b9cf5e7
addr2line -f -p -e debug/qtbrynhildr.exe 6b92b0a6
addr2line -f -p -e debug/qtbrynhildr.exe 6b92ab8e
addr2line -f -p -e debug/qtbrynhildr.exe 6285cf11
addr2line -f -p -e debug/qtbrynhildr.exe 6b978658
addr2line -f -p -e debug/qtbrynhildr.exe 76b08e71
addr2line -f -p -e debug/qtbrynhildr.exe 76b090d1
addr2line -f -p -e debug/qtbrynhildr.exe 76b0a66f
addr2line -f -p -e debug/qtbrynhildr.exe 76b0a6e0
addr2line -f -p -e debug/qtbrynhildr.exe 6b979c99
addr2line -f -p -e debug/qtbrynhildr.exe 6285cdf0
addr2line -f -p -e debug/qtbrynhildr.exe 6b927f94
addr2line -f -p -e debug/qtbrynhildr.exe 6b92822f
addr2line -f -p -e debug/qtbrynhildr.exe 6b92a53d
addr2line -f -p -e debug/qtbrynhildr.exe 00b66520
addr2line -f -p -e debug/qtbrynhildr.exe 0a57b357
addr2line -f -p -e debug/qtbrynhildr.exe 0040182a
addr2line -f -p -e debug/qtbrynhildr.exe 004145eb
addr2line -f -p -e debug/qtbrynhildr.exe 0041e0ad
addr2line -f -p -e debug/qtbrynhildr.exe 004013de
addr2line -f -p -e debug/qtbrynhildr.exe 749f7c04
addr2line -f -p -e debug/qtbrynhildr.exe 7706b90f
addr2line -f -p -e debug/qtbrynhildr.exe 7706b8da

これを実行すると以下の出力が得られました。

?? ??:0
?? ??:0

中略

?? ??:0
?? ??:0
_ZN8QPainter10drawPixmapEiiRK7QPixmap at C:/Tools/develop/Qt/Qt5.3.2/5.3/mingw482_32/include/QtGui/qpainter.h:786
_ZN11qtbrynhildr10MainWindow10paintEventEP11QPaintEvent at D:\home\xxxxxxx\Src\qtbrynhildr\src/mainwindow.cpp:130
?? ??:0
?? ??:0

 中略

?? ??:0
_Z5qMainiPPc at D:\home\xxxxxxx\Src\qtbrynhildr\src/main.cpp:92
WinMain@16 at c:\work\build\qt5_workdir\w\s\qtbase\src\winmain/qtmain_win.cpp:131
?? at fake:?
?? at crtexe.c:?
?? ??:0
?? ??:0
?? ??:0

2箇所の情報が得られました。2つ目はmain.cppなので、手がかりになりそうなのは1つ目の情報だけのようです。

mainwindow.cppの130行目は…

// paint event
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawPixmap(0, 0, *pixmap);  <== ここ
}

となっています。デスクトップ画像を表示するためのdrawPixmap関数を呼び出した先のどこかでどうやら例外が起こっているようです。

長くなったので"その2"に続きます。

2015年2月 2日 (月)

MinGW + WinSock

スループットの性能の問題で結局WinSockを使うことにしたのですが、その際のメモ書きです。

1,使い方としては通常のWinSockの手順をそのまま記述してやればよいらしい。WSADATA,MAKEWORDなどもそのまま書けばよいが、ヘッダーファイル「winsock2.h」と「ws2tcpip.h」をインクルードする必要がある。

ただし、connect()はsignal/slotのconnectマクロと競合するので"::"を先頭に付けて、正確に記述しないとコンパイルエラーとなる。

2,また.proのLIBSにwsock32.lib, ws2_32.libをリンクするために"-lwsock32 -lws2_32"を追加しなければならない。

3,今後のために、関数getaddrinfo(), ADDRINFO構造体を使う。

キーボードコントロールを実装しました その6

特殊なキーイベントの取得はできたのですが、「全角/半角キー」の情報だけが正しくサーバに送れませんでした。
リファレンスとして公開されている「ブリュンヒルデ零式改」の動作を確認してみましたが、こちらも同様です。

ならば…ということで本家ブリュンヒルデ(1.0.6)をクライアントモードで動作させると…

「IMEが正しくON/OFFできる…」

ということで、お手上げなので作者の方に連絡してみました。

早速お返事頂きまして、

「IMEを強制的にOFFにしないといけないかも」

とアドバイスを頂きました。

main関数の先頭に

ImmDisableIME(0);

とおまじないを書き、.proのLIBSに"-limm32"を追加します。(imm32.libをリンクする必要があるので)

qmakeを再実行し、makeすると強制IME-OFF仕様の実行ファイルが出来上がります。

実行すると…普通にサーバ側のIMEのON/OFFが出来ました\(;゚∇゚)/

ということで、「ブリュンヒルデ零式改」のソースコードzeroshikikai.cppにもこの修正が必要そうです。

WinMain()の先頭に同様におまじないを追加して、DebugビルドとReleaseビルドのリンカへの設定で"imm32.lib"のリンク指定を追加すればよいようです。

ということで、実に開発開始からほぼ一年がかりでしたが、基本機能の実装が終わりました。
(うち2ヶ月は放置でしたが…)

20150202_131021


2015年2月 1日 (日)

ブリュンヒルデ(パブリックモード)とQt Brynhildr(仮称)の比較

パブリックモードでのクライアントとしてのブリュンヒルデ(1.0.6)とQt Brynhildr(仮称:以下QtB)を私の環境で比較をしてみました。

実行ファイル(exeおよびdll)のトータルサイズはブリュンヒルデが500KB程ですが、QtBはQt5, MinGWのDLLを含めると48.2MB程になります。(実に100倍…)

実際のメモリ使用量はタスクモニタによれば、ブリュンヒルデが30MB程度、QtBが16MB程度です。メモリ使用量自体はQtBが半分程度のようです。

CPU使用率はQTBの方が2,3%程度重いようです。

制限としては、

Qtを使って実装したため、ブリュンヒルデサーバに要求したサウンド再生の品質(サンプルレート)でのサウンド再生がサポートできない場合がある。

という点があげられます。 やはりWindows版クライアントとしてのQtBのメリットはあまりないですね。

(注)
パブリックモードですので、今のところ「ファイル送受信」は出来ません…

« 2015年1月 | トップページ | 2015年3月 »