Day 6/100 100 Days of Code

Photo by RetroSupply on Unsplash

Day 6/100 100 Days of Code

Info hunter

I worked with my web scraper today. I tried to implement a frame that appears when a search is being executed to let the user know what is happening. This solution is quite ugly since a new window needs to appear while the main window just sits there unresponsive.

I think the solution to this is to run the search on another thread. This way, the GUI stays responsive while a search is running in the background. So, the next task I have to complete is to learn about multithreading.

Here's the code I experimented with but I didn't get the results I wanted.

// This frame should run without being affected by the
// scraping process
class PleaseWaitFrame : public wxFrame
{
public:
    PleaseWaitFrame();
    ~PleaseWaitFrame();

//    Frame Elements
private:
    wxStaticText *waitFrameText = nullptr;
    wxButton *stopButton = nullptr;
    wxPanel *mainPanel = nullptr;
    wxSizer *mainSizer = nullptr;
    wxSizer *textHolder = nullptr;

//    States
private:
    enum elements
    {
        eID_Panel = 0,
        eId_StopButton,
        eID_FrameText,
        eID_Frame
    };

//    Methods
private:
    void OnExit(wxCommandEvent &event);
};

void PleaseWaitFrame::OnExit(wxCommandEvent &event)
{
    close(true);
}

PleaseWaitFrame::PleaseWaitFrame(): wxFrame(nullptr, eID_Frame, "Please wait")
{
    mainSizer = new wxBoxSizer(wxHORIZONTAL);
    textHolder = new wxBoxSizer(wxVERTICAL);
    mainPanel = new wxPanel(this, eID_Panel, wxDefaultPosition);
    waitFrameText = new wxStaticText(mainPanel, eID_FrameText, "Please wait while it runs",
                                     wxDefaultPosition, wxDefaultSize, 0);
    textHolder->Add(waitFrameText, 1, wxEXPAND);
    mainSizer->Add(textHolder, 0 , wxEXPAND);
    mainPanel->SetSizerAndFit(mainSizer, true);
}

PleaseWaitFrame::~PleaseWaitFrame()
{
    waitFrameText->Destroy();
    mainPanel->Destroy();
}

The following code didn't work when a search was running. It did work in other events.

    auto getDisplaySize = wxGetDisplaySize();
    waitFrame->SetSize(getDisplaySize.GetWidth() * 0.1f,
                       getDisplaySize.GetHeight() * 0.1f);
    waitFrame->Show(true);