[C++] 286 FLTK : ChatGPTアプリの製作 その15 経過時間の測定

[M1 Mac, Monterey 12.6.3, clang 13.0.0, FLTK 1.3.8, ChatGPT Plus, NO IDE]

ChatGPTアプリの送受信に掛かる時間を測定して表示するようにしました。

これまでFLTKアプリで時間経過の概念を扱ったことがなかったので結構難航しました。

ストップウォッチの値が増えていく様子を表示したかったのですが、並列処理が出来なくて断念しました。

ウィンドウ範囲外の見えないボタンとしてStartボタン、Stopボタン、Resetボタンを配置し、送信ボタンのコールバック関数(sendCB関数)の中でdo_callback関数を使ってボタンを押すというややこしい仕様になっています。

ストップウォッチのGUI数値が送受信中に変化しなくてよいのであれば、もっと単純な方法で実装できていました。ソースコードの構成が複雑になるだけなので、明日以降簡潔な方法に変更します

こういったところはSDLに分があるのかもしれません。

void sendCB(Fl_Widget*, void*) {
    // ストップウォッチ開始
    resetBtn -> do_callback();
    startBtn -> do_callback();

    <中略>

    // ストップウォッチ停止
    stopBtn -> do_callback();
}
#include <FLstd.h>
#include <cppstd.h>
#include "Stopwatch.h"

// 経過時間を表示するFl_Output
extern Fl_Window* window;
extern Fl_Output* timeShow;

// ストップウォッチのインスタンスを作成する
Stopwatch stopwatch;

// スタートボタンが押された時のコールバック関数
void startCallback(Fl_Widget* widget, void*) {
    stopwatch.start();
}

// ストップボタンが押された時のコールバック関数
void stopCallback(Fl_Widget* widget, void*) {
    stopwatch.stop();
}

// リセットボタンが押された時のコールバック関数
void resetCallback(Fl_Widget* widget, void*) {
    stopwatch.reset();
    timeShow->value("");
}

// タイマーが起動した時のコールバック関数
void timerCallback(void*) {
    // 経過時間を取得して、Fl_Outputに表示する
    double elapsedTime = stopwatch.elapsedTime();
    stringstream ss;
    // ss << std::fixed << elapsedTime;
    ss << std::fixed << std::setprecision(1) << elapsedTime;
    // cout << "経過時間: " << ss.str() << endl;
    timeShow->value(ss.str().c_str());

    window -> redraw();

    // タイマーを再起動する
    Fl::repeat_timeout(0.01, timerCallback);
}