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

62
4

Я новичок в FLTK и C++. Мне нужна помощь в том, как заставить события работать. На других языках вы создаете кнопку и определяете функцию, которая будет обрабатывать событие с кнопок 1 и 2 в разных функциях, когда пользователь нажимает на него. Как добавление прослушивателя событий в button1 и его отображение на button1_click().

Это код из многопоточной среды. Мне интересно, как я могу прослушивать клики с кнопок 1 и 2 и обрабатывать их правильно.

Кроме того, с этим дизайном я планирую иметь отдельные данные обновления потока в графическом интерфейсе каждые 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;
}
};

спросил(а) 2021-01-15T16:38:16+03:00 3 месяца, 3 недели назад
1
Решение
130

Чтобы выполнить какое-либо действие с помощью кнопки, вам необходимо передать функцию обратного вызова:

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

ответил(а) 2021-01-15T16:38:16+03:00 3 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема