Проблемы с wxDialog и wxBusyInfo под линуксом

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
Styler
In need of some credit
In need of some credit
Posts: 6
Joined: Mon Feb 26, 2018 10:21 am

Проблемы с wxDialog и wxBusyInfo под линуксом

Post by Styler »

Привет, нужна помощь.
Я хочу показывать "Busy" диалог во время того пока дочерний процесс выполняет задачу. Доступа к прогрессу задачи у меня нет, могу только ждать пока она сама не завершится. После прогугливания нашел 2 способа. 1) использовать wxBusyInfo 2) создать wxDialog и показывать его не модально. Сделал тест, где вместо задачи поставил sleep(). На винде все работает прекрасно. Проблемы с линуксом. У меня имеются 2 виртуальные машины под виндой на VBox (Ubuntu 17.10 и CentOS 7.0). 1 вариант с wxBusyInfo на убунту работает лучше, окно показывается всегда, но текст внутри отрисовывается 7 из 10. На CentOS текста нет всегда, просто пустое окно. 2 варинт с wxDialog на линуксе работает нормально только первый раз, если запустить метод не закрывая приложение еще несколько раз то ничего не появляется вообще. Такое ощущение что Yield где-то "застревает", хотя окно в памяти создается нормально. Помогите пожалуйста разобратся. Может я что-то пропустил.. :(

Еще раз хочу упомянуть что код прекрасно работает под виндой, проблемы только с линуксом.
Код прилагается.

Code: Select all

// wxWidgets "Hello world" Program
// For compilers that support precompilation, includes "wx/wx.h".

#include <wx/wxprec.h>
#ifndef WX_PRECOMP
    #include <wx/wx.h>
#endif

#include <wx/busyinfo.h>


class MyApp: public wxApp
{
public:
    virtual bool OnInit();
};

class MyFrame: public wxFrame
{
public:
    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
private:
    void OnHello(wxCommandEvent& event);
    void OnDialog(wxCommandEvent& event);
    void OnBusyInfo(wxCommandEvent& event);
    void OnExit(wxCommandEvent& event);
    void OnAbout(wxCommandEvent& event);
    wxDECLARE_EVENT_TABLE();
};

class MyDialog: public wxDialog
{
public:
	MyDialog(wxWindow* parent)
		: wxDialog(parent, wxID_ANY, "Waiting")
	{
		wxBoxSizer* mainSizer = new wxBoxSizer(wxVERTICAL);
		mainSizer->Add(new wxStaticText(this, wxID_ANY, "Work in progress. Please wait."), 1, wxEXPAND | wxALL, 20);
		SetSizer(mainSizer);
		Fit();
		CenterOnParent();
	}
};

enum
{
    ID_Hello = 1,
	ID_Dialog = 2,
	ID_BusyInfo = 3
};

wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
    EVT_MENU(ID_Hello,   MyFrame::OnHello)
	EVT_MENU(ID_Dialog, MyFrame::OnDialog)
	EVT_MENU(ID_BusyInfo, MyFrame::OnBusyInfo)
    EVT_MENU(wxID_EXIT,  MyFrame::OnExit)
    EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
wxEND_EVENT_TABLE()

wxIMPLEMENT_APP(MyApp);

bool MyApp::OnInit()
{
    MyFrame *frame = new MyFrame( "Hello World", wxPoint(50, 50), wxSize(450, 340) );
    frame->Show( true );
    return true;
}

MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
        : wxFrame(NULL, wxID_ANY, title, pos, size)
{
    wxMenu *menuFile = new wxMenu;
    menuFile->Append(ID_Hello, "&Hello...\tCtrl-H", "Help string shown in status bar for this menu item");
    menuFile->Append(ID_Dialog, "&Show Dialog...\tCtrl-D", "Show wxDialog while doing some stuff");
    menuFile->Append(ID_BusyInfo, "&Show BusyInfo...\tCtrl-B", "Show BusyInfo dialog while doing some stuff");
    menuFile->AppendSeparator();
    menuFile->Append(wxID_EXIT);
    wxMenu *menuHelp = new wxMenu;
    menuHelp->Append(wxID_ABOUT);
    wxMenuBar *menuBar = new wxMenuBar;
    menuBar->Append( menuFile, "&File" );
    menuBar->Append( menuHelp, "&Help" );
    SetMenuBar( menuBar );
    CreateStatusBar();
    SetStatusText( "Welcome to wxWidgets!" );
}

void MyFrame::OnExit(wxCommandEvent& event)
{
    Close( true );
}

void MyFrame::OnAbout(wxCommandEvent& event)
{
    wxMessageBox( "This is a wxWidgets' Hello world sample",
                  "About Hello World", wxOK | wxICON_INFORMATION );
}

void MyFrame::OnHello(wxCommandEvent& event)
{
    wxLogMessage("Hello world from wxWidgets!");
}

void MyFrame::OnDialog(wxCommandEvent& event)
{
	MyDialog dlg(this);
	dlg.Show();
	wxYieldIfNeeded();

#if defined(_WIN32)
	Sleep(2000);
#else
	sleep(2);
#endif
}


void MyFrame::OnBusyInfo(wxCommandEvent& event)
{
    wxBusyInfo dlg("Work in progress. Please wait.", this);

#if defined(_WIN32)
	Sleep(2000);
#else
	sleep(2);
#endif
}
Attachments
Screenshot at 2018-05-09 11-42-58.png
Screenshot at 2018-05-09 11-42-58.png (39.84 KiB) Viewed 3266 times
Screenshot at 2018-05-09 11-42-35.png
Screenshot at 2018-05-09 11-42-35.png (53.59 KiB) Viewed 3266 times
Styler
In need of some credit
In need of some credit
Posts: 6
Joined: Mon Feb 26, 2018 10:21 am

Re: Проблемы с wxDialog и wxBusyInfo под линуксом

Post by Styler »

Мне удалось победить wxBusyInfo, вставив задержку. Выглядит это конечно грязновато. Если ли более уподобающий способ подождать пока ивенты пройдут через очередь?

Code: Select all

void MyFrame::OnBusyInfo(wxCommandEvent& event)
{
    wxBusyInfo dlg("Work in progress. Please wait.", this);

    // pause for a 5 ms with yielding to be sure that events went through
    for (int i = 0; i < 5; i++) {
    	wxMilliSleep(1);
    	wxYieldIfNeeded();
    }

#if defined(_WIN32)
	Sleep(2000);
#else
	sleep(2);
#endif
}
Styler
In need of some credit
In need of some credit
Posts: 6
Joined: Mon Feb 26, 2018 10:21 am

Re: Проблемы с wxDialog и wxBusyInfo под линуксом

Post by Styler »

Это сработало и для wxDialog. Пришлось увеличить задержку. Остается понять как сделать это более элегантным способом
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: Проблемы с wxDialog и wxBusyInfo под линуксом

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
Luchshee - vrag horoshego. ;-)
A esli ser'ezno - zachem? wxBusyInfo dolgen rabotat'.

Ya tak ponjal chto dlja rabochej nitki kod zakrytyj? Togda eto tjagelee. Kak vy otslegivaete okonchanie ee raboty?
A samoe glavnoe - vash test so "sleep" ne sovsem korrekten - sleep() sama po sebe nichego delat ne budet.

Kak vse eto rabotaet s realnoj programmoj?
Styler
In need of some credit
In need of some credit
Posts: 6
Joined: Mon Feb 26, 2018 10:21 am

Re: Проблемы с wxDialog и wxBusyInfo под линуксом

Post by Styler »

Должно но не работает =)

>> Ya tak ponjal chto dlja rabochej nitki kod zakrytyj? Togda eto tjagelee. Kak vy otslegivaete okonchanie ee raboty?
>> A samoe glavnoe - vash test so "sleep" ne sovsem korrekten - sleep() sama po sebe nichego delat ne budet.
Да закрыт. Это клиент на TCP сокетах, можно выставить таймаут. Пробовал на реальной функции, с виду работает сходно со sleep() и по сути блокирует дальнейшее выполнение операций пока не "отомрет".
Post Reply