Отображение событий FLTK / многопоточность

Я новичок в 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;
}
};

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);

Обновлять пользовательский интерфейс из потоков небезопасно. Это должно быть сделано только из основного потока. использование Fl::awake (Fl_Awake_Handler cb, void *message=0) в вашем thFn выполнить некоторую функцию обратного вызова в основном потоке.

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

void* thFn(void* param)
{
...
Fl::awake(updateUI, userdata);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]