GUI在多线程应用程序中的Wxwidgets中没有响应

时间:2011-04-02 16:15:58

标签: multithreading user-interface wxwidgets

我几天来一直在努力解决这个问题。该程序是多线程的,新创建的线程引发了将数据写入主线程的事件。但是程序是当线程调用事件时gui变得无响应。如果我用一些独立的消息框替换status_brute_text-> AppendText(wxT(“insert”)),那么程序运行没有问题。线程也作为可拆卸和可连接的方式传递,但没有区别。我实际上打算用这个线程用wxExecute打开一个控制台应用程序,并将其输出输出到gui。任何帮助将不胜感激。

提前感谢你......

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 个答案:

答案 0 :(得分:1)

<强>问题:

AppendText()会生成wxEVT_COMMAND_TEXT_UPDATED,这会导致testerFrame::insert()被调用,调用AppendText()会生成另一个wxEVT_COMMAND_TEXT_UPDATED .....

来自wxWidgets Documentation

  

...一个   wxEVT_COMMAND_TEXT_UPDATED事件,   文本更改时生成[]。   请注意,此事件将被发送   当文本控制内容时   变化 - 这是否是由于用户造成的   输入或来自程序本身   (例如,如果SetValue()是   所谓的);请参阅ChangeValue()获取   不发送此功能的功能   事件

<强>解决方案:

使用ChangeValue( status_brute_text->GetValue() + "insert" )代替AppendText( "insert" )