wxWidgets — `wxTimer` для обновления функции каждую секунду

#c #user-interface #wxwidgets

#c #пользовательский интерфейс #wxwidgets

Вопрос:

Я пытаюсь создать музыкальное приложение, используя wxWidgets , я тоже новичок в wxWidgets C , я создал функцию, которая должна обновлять прошедшее время, когда пользователь воспроизводит песню, поэтому панель поиска и цифровые часы обновляются с позицией песни каждую секунду. Я настроил wxTimer так

     timer = new wxTimer(this);
    timer->Bind(wxEVT_TIMER, amp;Frame::UpdateElapsedTime, this);
  

и функция, которая запускает таймер,

 void Frame::Play(wxCommandEventamp; event)
{
    stopped = false;

    int songIndex = 0;

    std::string Song;
    wxString wxSong;

    songIndex = playlistBox->GetSelection();
    wxSong = playlistBox->GetString(songIndex);

    Song = std::string(wxSong);
    Song = "/home/apoorv/Music/mod/"   Song;

    std::cout << "wxString: " << wxSong << std::endl;
    std::cout << "Song: " << Song << std::endl;

    mediaCtrl->Load(Song);
    mediaCtrl->Play();

    timer->Start(1000);
}
  

и функция, которую я хочу обновлять каждую секунду, это

 void Frame::UpdateElapsedTime(wxTimerEventamp; event)
{

    wxLogMessage("OnTimer called.");

    seekBar->SetValue(mediaCtrl->Tell());
    seekBar->SetMax(mediaCtrl->Length());

    std::string SongTime = std::to_string(mediaCtrl->Tell() / 60000)   ":"   std::to_string(mediaCtrl->Tell() / 1000)
          "/"   std::to_string(mediaCtrl->Length() / 60000)   ":"   std::to_string(mediaCtrl->Length() / 1000);

    staticText->SetLabel(SongTime);
}
  

Он компилируется нормально, но ничего не происходит. Я делал подобное, когда использовал wxPython до этого, и это сработало.

Комментарии:

1. @apoorv569 Не могли бы вы попробовать вызвать Bind() on this вместо on timer ?

2. @apoorv569, вы сами создаете кнопку воспроизведения и элементы управления, а не вызываете ShowPlayerControls() ?

3. @apoorv569, эта функция будет использовать внутренние элементы управления проигрывателя. Создайте и запустите образец мультимедиа — он показывает, что он делает. По сути, у вашего базового проигрывателя уже есть все эти элементы управления. Вам просто нужно показать их с помощью этого вызова. Проблема в том, что они есть не у всех игроков. Посмотрите, можете ли вы отобразить внутренние, а если нет — создайте их самостоятельно. Кроме того, небольшое предложение — если вы чего-то не понимаете в wx, попробуйте пример. Если это все еще не ясно — попробуйте.

4. Есть ли вероятность, что что-то вызывает timer->Stop() ? Если, например, ваша кнопка «Стоп» делает это, можете ли вы проверить, вызывается ли ее обработчик каким-либо образом (случайно или нет)?

5. @apoorv569 Я рад, что проблема устранена. Что касается перемещения функций, возможно, было бы лучше опубликовать это как еще один вопрос, поскольку этот уже становится слишком длинным с комментариями. В общем, делать ваши виджеты статичными — плохая идея, поэтому сначала подумайте / найдите другие способы разделения кода.