GUI не отвечает в Wxwidgets в многопоточном приложении - PullRequest
1 голос
/ 02 апреля 2011

Я боролся с этим кодом уже несколько дней. Программа является многопоточной с недавно созданными потоками, вызывающими события для записи данных в основной поток. Но программа в том, что графический интерфейс перестает отвечать на запросы, когда поток вызывает событие. Если я заменю status_brute_text-> AppendText (wxT ("insert")) на какое-то независимое окно сообщения, тогда программа запускается без проблем. Также поток передается как отделяемый и присоединяемый, но никакой разницы не возникает. На самом деле я планирую открыть консольное приложение с этим потоком с помощью wxExecute и вывести его вывод в графический интерфейс. Любая помощь будет принята с благодарностью.

Заранее благодарю ....

testerFrame::testerFrame(wxFrame *frame)
    : GUIFrame(frame)
{
#define thread_adder 10

#if wxUSE_STATUSBAR
    statusBar->SetStatusText(_("John the ripper GUI"), 0);
    statusBar->SetStatusText(wxbuildinfo(short_f), 1);
#endif
    this->Connect(wxID_ANY,wxEVT_COMMAND_TEXT_UPDATED,
     wxCommandEventHandler(testerFrame::insert));
}

testerFrame::~testerFrame()
{
}

void testerFrame::insert(wxCommandEvent &event)
{
 status_brute_text->AppendText(wxT("insert"));
}

void testerFrame::OnClose(wxCloseEvent &event)
{
    Destroy();
}

void testerFrame::OnQuit(wxCommandEvent &event)
{
    Destroy();
}

void testerFrame::OnAbout(wxCommandEvent &event)
{
    wxString msg = wxbuildinfo(long_f);
    wxMessageBox(msg, _("Welcome to..."));
}

void testerFrame::configure(wxCommandEvent &event)
{
    wxString msg = wxT("Will be implemented later");
    wxMessageDialog *dialog = new wxMessageDialog(0L,msg,_("hia"),wxYES_NO);
    dialog->ShowModal();
}

void testerFrame::select_pass_file( wxCommandEvent& event )
{

if(m_filePicker2->GetPath().IsEmpty())
{
    return;
}
}

void testerFrame::start_john(wxCommandEvent &event)
{
    /*wxArrayString output,output2;
    wxString command = wxString(wxT("john --incremental --session:jvc")) + m_filePicker2->GetPath();
    wxMessageBox(command);
    wxExecute(command,output);*/
    MyThread *th = new MyThread(this);
    th->Create();
    th->Run();
}

void *MyThread::Entry()
{

    // notify the main thread
    wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, wxID_ANY);
    event.SetInt(1);
     // pass some data along the event, a number in this case
    m_parent->GetEventHandler()->AddPendingEvent( event );
    return 0;
}

1 Ответ

1 голос
/ 03 апреля 2011

Проблема:

AppendText() генерирует wxEVT_COMMAND_TEXT_UPDATED, который вызывает testerFrame::insert(), который вызывает AppendText(), который генерирует другой wxEVT_COMMAND_TEXT_UPDATED .....

Из Документация wxWidgets :

... событие wxEVT_COMMAND_TEXT_UPDATED, [генерируется] при изменении текста.Обратите внимание, что это событие будет отправлено, когда текстовые элементы управления изменятся - независимо от того, происходит ли это из-за ввода данных пользователем или из самой программы (например, если вызывается SetValue ());см. ChangeValue () для функции, которая не отправляет это событие

Решение:

Используйте ChangeValue( status_brute_text->GetValue() + "insert" ) вместо AppendText( "insert" ).

...