DXライブラリ使用時に終了後もプロセスが残る問題
事の始まり
DXライブラリを用いて通信(チャットプログラム)を試していたら、突然エラーが出るようになった。
exeを起動しっぱなしの状態で実行すると出てくるエラーだが、今回はちゃんと終了させてから再び実行したはず…
そこで、 タスクマネージャで調べてみると…
あれ、バックグラウンドでプロセスが残ってる…?(Chat.exeが試してるプログラム)
こいつを終了してやるとエラーが消えたので、やはり原因はこいつが残っている事にある。
しかし、なぜ残っていたのだろうか…
exeを直接実行しては終了を繰り返すとエライ事に
調べてみたところ、恐らくProcessMessage()やDxLib_End()を適切に実行するようなプログラムを書けていないのが原因である。
ダメなパターン
プロセスが残ってしまう今回のパターンでは次のようなコードを書いた。
#include <DxLib.h> //省略(他のインクルードやグローバル変数) int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //省略(初期化やウィンドウサイズの設定など) //ZキーかXキーの入力があるまでループ(入力の受け付け) while (GetKey(KEY_INPUT_Z) == 0 && GetKey(KEY_INPUT_X) == 0) { KeyUpdate(); } //省略(他の処理) DxLib_End(); return 0; }
大部分を省略してしまったが、GetKey関数とKeyUpdate関数は自作関数で、それぞれキーの状態とキーの入力状態の更新を行う自作の関数だ。
このような無限ループを用意してしまうと、もし入力の受け付け部分の無限ループでウインドウ右上の×を押した際に、恐らくDxLib_End関数まで処理が進まない。
もっと言えばDXライブラリではProcessMessage関数を毎フレーム実行するようにしないといけない(詳しくは知らないが、そうしないと正しく動かない可能性がある)らしいので、その点も悪いと考えられる。
恐らくDXライブラリを用いるプログラムとしては0点である。
(多分)大丈夫なパターン
要するに、DXライブラリを用いる際は
- ループの時にProcessMessage関数を毎フレーム実行する
- 最終的にDxLib_End()を実行する
という事に気を付ければいいんだと思う。(多分)
てなわけで早速修正。
#include <DxLib.h> //省略(他のインクルードやグローバル変数) int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //省略(初期化やウィンドウサイズの設定など) //ZキーかXキーの入力があるまでループ(入力の受け付け) while (ProcessMessage() == 0) { if (GetKey(KEY_INPUT_Z) == 0 && GetKey(KEY_INPUT_X) == 0) { KeyUpdate(); } else { break; } } //省略(他の処理) DxLib_End(); return 0; }
キー入力など毎フレーム受け付けるタイプのものを利用する時はProcessMessage関数を実行する。
こうやって書く事で×ボタンでウインドウが閉じられた際にProcessMessage関数が0以外を返すので、無限ループを抜けDxLib_End関数を実行して終了してくれるはず。
このように書き直したところ、終了後にプロセスが残ってなかったので多分これでいいと思う。
用いるライブラリの仕様は最低限把握しておこう。
ネットワークメモ
目次
ネットワーク
- ネットワークにおいて重要なことは他のコンピュータの情報を利用すること。(情報の共有化)
- パケット交換方式:データを細かく分けて送る方式
ネットワーク機器の会社が独自の通信ルールを定めると異なる会社の機器を用いた際に通信が上手く行えない。
そこで、異なる機種同士の接続を行うための標準化を進めた。
国際標準化機構(ISO)によって作られたネットワークの標準モデルをOSI参照モデルと呼び、このモデルでは通信機能を7階層に分割している。
また、米国国防高等研究計画局(DARPA)によって作られたTCP/IPモデルというものも存在し、このモデルでは通信機能を4階層に分割している。
いずれも通信ルールを定めるという意味で役割は同じ。
インターネットに使われている通信ルール(TCP/IPプロトコル)はTCP/IPモデルに沿っている。
OSI参照モデル | TCP/IPモデル |
---|---|
アプリケーション層 | アプリケーション層 |
プレゼンテーション層 | (アプリケーション層) |
セッション層 | (アプリケーション層) |
トランスポート層 | トランスポート層 |
ネットワーク層 | インターネット層 |
データリンク層 | インターフェース層 |
物理層 | (インターフェース層) |
TCP/IPモデルのアプリケーション層はOSI参照モデルでのアプリケーション層・プレゼンテーション層・セッション層を兼ねる。
TCP/IPモデルのインターフェース層はOSI参照モデルでのデータリンク層・物理層を兼ねる。
TCP/IPモデル | プロトコルの例 |
---|---|
アプリケーション層 | HTTP,DNS,SMTP,POP3 |
トランスポート層 | TCP,UDP |
インターネット層 | IP |
インターフェース層 | イーサネット,PPP,PPPoE |
以下TCP/IPモデルでの各層についての記述。
インターフェース層
- LAN:会社内や大学内など特定の狭い範囲で用いられるネットワーク
- イーサネット:LANで用いられるプロトコル。LANに繋がってる複数のコンピュータがやり取りを行う
- ハブ:複数のコンピュータを接続するための中継用の機器
複数のコンピュータがデータの送受信を行うので、例えば同時にデータ(電気信号)が通ると衝突して通信に失敗する。
→イーサネットではCSMA/CDという仕組みを用いて衝突を回避している
通常のハブの他、スイッチングハブが存在する。
通常のハブの場合、LAN内の他の特定のコンピュータへデータを送信すると接続されている全てのPCにデータが流れ、正しい送信先のコンピュータは流れてきたデータを受け取り、それ以外のコンピュータは自分宛じゃない事を確認して破棄している。
スイッチングハブの場合送信するデータの送信先を調べ該当するコンピュータにのみデータを流す。
WANはLANと異なり長距離の送信かつ通信事業者の提供するサービスを利用するため、PPPによって認証などが行われる。
PPPの認証機能をイーサネット上で利用するためにPPPoEというプロトコルが存在する。
インターネット層
複数のネットワーク(コンピュータのグループ)をつなぐ。
ネットワーク内の通信は外へは出ず、他のネットワークにデータを送る場合はルータを利用する。
- ルータ:ネットワーク同士を接続するのに使用する。また、ルーティングというデータの送信に適切な経路を決定する機能も持つ
インターフェース層ではMACアドレスを利用して次にデータを送る機器(中継を含む)を定めているのに対し、インターネット層ではIPアドレスを利用して最終的な送信先を定めている。
- IPアドレス:ネットワーク上の機器を識別するための数字。ネットワーク部とホスト部からなる
- サブネット:1つのネットワークをさらに複数の小さなネットワークに分割すること。識別用にホスト部の一部を利用する(サブネット部)
- サブネットマスク:どこまでがサブネット部なのかを示すための値。ネットワーク部とサブネット部のビットは1、残りのホスト部のビットを0とする
トランスポート層
ポート番号を利用して受信したデータがどのアプリケーションのものなのかを判別。
また、正しいデータをアプリケーションへ正しく送信する。
- ポート番号:各アプリケーションに割り当てられる番号
主要なサービスを提供するアプリケーション(メールの送信、Webサイトの情報送信)のポート番号は基本的に固定。
アプリケーション | ポート番号 |
---|---|
SMTP | 25 |
DNS | 53 |
HTTP | 80 |
POP3 | 83 |
他にもいろいろある。サービスを要求するアプリケーションは提供側や他のアプリケーションと被らない番号を設定する。
トランスポート層での主なプロトコルにはTCPとUDPがある。
TCPは送信先に確実にデータを送る事を意識しているプロトコルである。
送信先がデータを受信できるか確認(スリーハンドシェイク)を行った後にデータを送信する。
分割したデータに番号を割り振り順序制御や再送制御を行い信頼性を高める。
フロー制御を行い効率化を行う。
UDPはTCPとは逆に高速性を意識したプロトコルである。(TCPは信頼性を高める代わりに遅い)
少量のデータ送信やリアルタイム配信などの場合はこちらを用いる。
アプリケーション層
各アプリケーションに対し適切な通信サービスを行う。
Webサービスやメール受信サービスなどで異なるプロトコルが用意されている。
- クライアント・サーバ型:要求側(クライアント)と提供側(サーバ)に分かれてデータをやり取りする形式
以下代表的なプロトコルとその役割
Markdownで資料を作る
Markdownとは
Markdown(マークダウン)は、文書を記述するための軽量マークアップ言語のひとつである。本来はプレーンテキスト形式で手軽に書いた文書からHTMLを生成するために開発されたものである。
(Wikipediaより引用)
要するに、比較的手軽にメモとか資料が書けるんです。(雑)
Qiitaとかはてなブログの記事を書くのにも使えるっぽいです。
どんな感じのものができるの
最終的にHTMLに変換してブラウザで表示しますが、こんな感じになります。
用いるソフトウェアによってビジュアルは若干変化すると思います。
これは後述するSublime Textを用いてHTMLで出力したものです。
比較的シンプルな見た目で、ソースコードが結構綺麗に表示できるっぽい。
環境の導入
大まかな手順はこんな感じ
Sublime Textのインストール
この辺を参照
http://webmem.hatenablog.com/entry/sublime-text
Markdownを利用するためのパッケージのインストール
この辺を参照
http://webmem.hatenablog.com/entry/sublime-text-markdown
上のリンクを読みながら最終的にこの辺のパッケージを導入しておけば快適に扱えると思う。
- Japanize (日本語化)
- OmmiMarkupPreviewer (Markdownのプレビュー)
- Monokai Extended (Markdownのシンタックスハイライト)
- Markdown Extended (Markdown内のコードのシンタックスハイライト)
- Trailing Space (行末半角スペースの可視化)
- IMESupport (日本語入力を行いやすくする)
書き方
C言語やTeXなどと同様、書き方のルールがあるのでそれに従う。
書き方はこの辺を参照。QiitaでのMarkdown記法とかとは若干挙動が異なる場合がある?(よく分かってない顔
ちなみに、拡張子は[.md]となっている。
http://qiita.com/tbpgr/items/989c6badefff69377da7#%E8%A1%A8%E7%A4%BA%E4%BE%8B-10
http://cartman0.hatenablog.com/entry/2015/03/31/034758
終わりに
綺麗だからみんな使おう!(布教活動)