1

FLTKとC++は初めてです。イベントを機能させる方法について助けが必要です。他の言語では、ボタンを作成し、ユーザーがボタンをクリックしたときに異なる関数でbutton1とbutton2からのイベントを処理する関数を定義します。button1にイベントリスナーを追加し、それをbutton1_click()にマッピングするようなものです。

これは、マルチスレッド環境からのコードです。button1とbutton2からのクリックをリッスンし、正しく処理するにはどうすればよいのでしょうか。

また、この設計では、ループ内で200ミリ秒ごとにGUIで個別のスレッド更新データを使用することを計画しています。このループでロックとロック解除を呼び出すと、例外がスローされる可能性はありますか?

ありがとう!!

#pragma once

#include <Fl.H>
#include <Fl_Window.H>
#include <Fl_Button.H>
#include <Windows.h>

class MGui
{
    public:
    Fl_Window*  window;
    Fl_Button*  button1;
    Fl_Button*  button2;

    static MGui &i() 
    {
        static MGui sMGui;
        return sMGui;
    }
    static void init() 
    {
        i();
        DWORD dwThreadId;
        CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) run, (LPVOID) 0, NULL, &dwThreadId); 
    }
    static DWORD_PTR WINAPI run(void *theParam)
    {
        i().window = new Fl_Window(100, 100, 340, 180, "Window");
        i().button1 = new Fl_Button(10, 10, 50, 24, "Button1");
        i().button2 = new Fl_Button(10, 44, 50, 24, "Button2");
        i().window->end();
        i().window->show();
        Fl::run();
        return 0;
    }
};
4

1 に答える 1

1

コールバック関数を渡すために必要なボタンを使用して、いくつかのアクションを実行します。

void cancel_callback(Fl_Widget* obj, void* data)
{
..
//do something
..
}
...
cancel = new Fl_Button(x, y, x1, y1, "Cancel");
cancel->callback(cancel_callback,(void*)this);

スレッドからUIを更新するのは安全ではありません。メインスレッドからのみ実行する必要があります。Fl::awake (Fl_Awake_Handler cb, void *message=0)thFnで使用して、メインスレッド内でコールバック関数を実行します。

void updateUI(void *userdata) 
{
...
// update UI
...
}

void* thFn(void* param)
{
...
Fl::awake(updateUI, userdata);
}
于 2012-11-22T08:06:47.127 に答える