1

私はgtkmmを使った小さなアプリケーション用のプラグインに取り組んでいます。私が取り組んでいるプラグインは、毎分後に特定の条件(日付が変更され、新しい日が開始された)をチェックし、条件が真の場合にいくつかのアクションを開始します。プラグインの初期化部分には、Glib::SignalTimeoutとsigc++を使用する次のコードがあります。

testCounter = 0;
sigc::slot<bool> tslot = sigc::mem_fun(*this, 
               &NoteOfDayFactory::checkNewDay);
timeoutObj = Glib::signal_timeout()
              .connect(tslot,CHECK_INTERVAL);

ここで、testCounterは初期化メソッドを含むクラスで定義された属性であり、CHECK_INTERVALは1分に等しい定数です。存在する他のすべての変数は、初期化コードとコールバックメソッドを含むクラスで定義されています。checkNewDayメソッドは、条件がテストされ、日が変更された場合にアクションが実行される場所です。

bool NoteOfDayFactory::checkNewDay() {
    std::cout << "Checking for new day every minute or so" << std::endl;
    std::cout << "Before incrementing" << std::endl;
    for(int i = 0; i < 100000; i++);
    counter++;
    std::cout << counter << " minutes elapsed" << std::endl;
    return true; }

実際のアクションを使用する前に、上記の小さなテストコードを配置して、すべてがうまくいき、checkNewDayが1分に1回しか呼び出されないかどうかをテストしました。私が見つけたものは私を困惑させます。1分ごとに、stdoutに(少なくとも)10個のメッセージが出力されますが、変数は1分ごとに1回だけ増加します。

****** をちょきちょきと切る ****

毎分かそこらで新しい日をチェックしています

インクリメントする前

1分経過

毎分かそこらで新しい日をチェックしています

インクリメントする前

1分経過

**** をちょきちょきと切る ****

毎分かそこらで新しい日をチェックしています

インクリメントする前

2分経過

毎分かそこらで新しい日をチェックしています

インクリメントする前

2分経過

**** をちょきちょきと切る ******

テキストが10個(またはそれ以上)の異なるバッファに送信され、1分ごとに一度に印刷されたように動作します。誰かが私を啓発し、なぜこれが起こっているのかを理解するのを手伝ってくれるでしょうか。コールバックは1分に1回しか呼び出されないと確信しているからです。ありがとうございました!

4

1 に答える 1

2

私は次のコードで再現しようとしました:

#include <iostream>
#include <glibmm.h>

unsigned counter = 0;

bool checkNewDay()
{
    std::cout << "Checking for new day ..." << std::endl;
    counter++;
    std::cout << "counter = " << counter << std::endl;

    return true;
}


int main()
{
    static const unsigned delayInMillis = 1000;

    sigc::slot<bool> tslot = sigc::ptr_fun(&checkNewDay);
    Glib::signal_timeout().connect(tslot, delayInMillis);

    std::cout << "Starting Glib::MainLoop" << std::endl;
    Glib::MainLoop::create(false)->run();
}

それは(期待通りに)出力します:

Starting Glib::MainLoop
Checking for new day ...
counter = 1
Checking for new day ...
counter = 2
Checking for new day ...
counter = 3
Checking for new day ...
counter = 4

最終的にコードに固有のものを追加して、私のような簡単な例で再現してみることをお勧めします。

イベントを何度も処理するGlib/Gtkmmメソッドを呼び出さない限り、なぜそれが機能しないのかわかりません!?メインループはどうですか?

これはあまり役に立たないことは知っていますが、私にとってはうまくいきます...

于 2009-07-13T09:33:25.057 に答える