2

ここで何かトリッキーに聞こえますが、実際には Xlib を使用していくつかのウィンドウを描画しています。1 つは 2D の結果を画像にプロットするためのもので、これはすべての計算が完了したときにのみ描画されます。もう1つは、「処理中の計算」と表示される単純なウィンドウです。

  • ですから、微積分を始める前に、「プロセス中の微積分という単純なウィンドウを見せてください」と呼びます。
  • 次に、計算を実行して結果をプロットする関数を呼び出します。
  • 次に、「計算中の単純なウィンドウを表示しないでください」と呼びます。

しかし、問題は、計算中に「簡単なウィンドウ「計算中」を表示」が表示されず、計算の結果の画像が表示されたときに一瞬だけ表示され、消えてしまうことです。私はいくつか入れようとしますsleep()が、それは問題を解決しません。そのような問題を引き起こす可能性のあるものは何ですか?私は C++ のコースで既にそのような問題に遭遇しました。当時、私はコンソールで作業していましたが、そのような問題の理由は見つかりませんでした。

上司のように対処するのに役立つ説明とヒントを誰か教えてもらえますか?

ここに私のコードのsh ..の一部:

switch(e.type/*xlibevent*/){
      .
      .
      .
      case KeyRelease      :
        switch(keyRelease()){ // keyRelease just recognize wich key was released
            .
            .
            .       // w3w1 = window "calculus in process"
          case 3  : w3w1.switcher(); doCalculus(&w1); w3w1.switcher(); break;
            .
            .
            .
      .
      .
      .
        }

テストを行ったところ、同じ結果でスワップdoCalculus(&w1)しましたsleep(3)が、ウィンドウに「処理中の微積分」が表示されません

訂正がありますswitcher()

  void switcher(){
    if(this->visible==0){
      XMapWindow(dpy,this->window); // what I though before : has to map the window 
                                    // what I think now : request to map the window
      XDrawString(dpy, this->window, this->gc, 10, 14, text.c_str(), text.length());
      XFlush(dpy); // dats what missed, not sure that efficient to flush the dpy
                   // but I deal with the part of xlib I know, I will check further
                   // about that
      visible=1;
    }else{
      XUnmapWindow(dpy,this->window);
      XFlush(dpy); //...
      visible=0;
    }
4

2 に答える 2

1

メイン イベント ループは、計算によってブロックされている可能性があります。したがって、コンピュータでビジー状態である限り、何も表示できません。一時ウィンドウを表示した後、X イベント ループに少なくとも 1 回戻ると、一時ウィンドウが表示されます (ただし、露出イベントに応答しないため、適切に更新されない場合があります)。最善の解決策は、別のスレッドで計算を実行することです。

「単純なウィンドウを表示するのを待たない理由」についてのあなたの混乱は、X クライアントがどのように機能するかについての誤解に基づいています。クライアントとサーバーの間には (単純なことを行う場合でも)、直感的に予想されるよりも多くの対話があります。

于 2013-06-11T00:26:22.553 に答える
1

これが OpenGL に関する質問ではないことはわかっていますが、この OpenGL チュートリアルはこの問題に光を当てることができます。基本的に、作成したウィンドウが表示されるようにするために「ウィンドウ」メッセージを処理していません。while(1)wikiでループを確認してください。

次の 2 つの選択肢があります。

  1. 計算を段階的に実行します。while ループ内の各呼び出しによって各ステップが処理される場所
  2. 別のスレッドで計算を実行し、while(1)ループ内からすべてのフレームで進行状況を照会して表示します。

個人的には2の方がいいです。

于 2013-06-11T00:31:26.700 に答える