2012-11-22 4 views
1

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

Это код из многопоточной среды. Мне интересно, как я могу прослушивать клики с кнопок 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; 
    } 
}; 

ответ

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