Я новичок в FLTK и C ++. Мне нужна помощь, чтобы заставить события работать. На других языках вы создаете кнопку и определяете функцию, которая будет обрабатывать событие от button1 и button2 в разных функциях, когда пользователь нажимает на нее. Как добавление прослушивателя событий в button1 и сопоставление его с button1_click ().
Это некоторый код из многопоточной среды. Мне интересно, как я могу слушать клики от button1 и button2 и обрабатывать их правильно.
Кроме того, с этим дизайном я планирую иметь отдельные данные обновления потока в GUI каждые 200 миллисекунд в цикле. Если я вызову блокировку и разблокировку в этом цикле, есть ли вероятность, что это может вызвать исключение?
Спасибо!!
#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;
}
};
Чтобы выполнить какое-либо действие с помощью кнопки, вам нужно передать функцию обратного вызова:
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);
Обновлять пользовательский интерфейс из потоков небезопасно. Это должно быть сделано только из основного потока. использование Fl::awake (Fl_Awake_Handler cb, void *message=0)
в вашем thFn выполнить некоторую функцию обратного вызова в основном потоке.
void updateUI(void *userdata)
{
...
// update UI
...
}
void* thFn(void* param)
{
...
Fl::awake(updateUI, userdata);
}
Других решений пока нет …