📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| 8行目: | 8行目: | ||
== CUIソフトウェアの開発手順 == | == CUIソフトウェアの開発手順 == | ||
例えば、以下のようなCUIソフトウェアのソースコードを記述したとする。<br> | 例えば、以下のようなCUIソフトウェアのソースコードを記述したとする。<br> | ||
<br> | |||
以下のソースコードにおいて、CUIソフトウェアは、永遠に終了しないプログラムになってしまう。<br> | |||
なぜなら、<code>QCoreApplication</code>クラスの<code>exec</code>メソッドは、<code>exit</code>メソッドが呼ばれるまでループし続けるからである。<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
int main(int argc, char * argv[]) | int main(int argc, char * argv[]) | ||
| 23行目: | 26行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
これを解決するには、主の処理が終了する時、任意の地点で<code>exit</code>関数を呼び出すランナークラスを作成すればよい。<br> | |||
<br> | <br> | ||
例えば、以下のようなCUIRunnerクラスを定義する。<br> | 例えば、以下のようなCUIRunnerクラスを定義する。<br> | ||
そして、CUIRunnerクラスのrunスロット内にメイン処理を記述して、処理を終了する時に<code>QCoreApplication</code>クラスの<code>exit</code>メソッドを呼び出せばよい。<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
// CUIRunner.h | // CUIRunner.h | ||
| 63行目: | 64行目: | ||
<br> | <br> | ||
ここで重要なことは、<code>QTimer</code>クラスの<code>singleShot</code>メソッドのタイムアウト時間を0に設定していることである。<br> | ここで重要なことは、<code>QTimer</code>クラスの<code>singleShot</code>メソッドのタイムアウト時間を0に設定していることである。<br> | ||
このように記述することにより、ウインドウシステムの全てのイベント(描画処理等)が処理された後に、runメソッドで定義した処理が実行される。<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#include <QCoreApplication> | #include <QCoreApplication> | ||
#include <QTimer> | #include <QTimer> | ||
#include | #include "CUIRunner.h" | ||
int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||
| 74行目: | 75行目: | ||
// ランナー開始 | // ランナー開始 | ||
CUIRunner runner; | |||
QTimer::singleShot(0, &runner, SLOT(run())); | QTimer::singleShot(0, &runner, SLOT(run())); | ||