Я использую fork()
, чтобы создать дочерний элемент для воспроизведения mp3-файла, пока родительский процесс принимает данные от пользователя.
Я бы хотел остановить воспроизведение mp3-файла, когда пользователь выберетперейти к следующему кадру, поэтому я использую SIGKILL
, чтобы немедленно убить ребенка, прежде чем перейти к следующему кадру.
К сожалению, это не работает, и mp3 продолжает воспроизводиться также, когдапользователь в следующем кадре.
Как я могу это решить?
pid_t pid = -1;
SecondPage::SecondPage(wxWindow* parent,wxWindowID id)
{
//(*Initialize(SecondPage)
Create(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("wxID_ANY"));
SetClientSize(wxSize(1314,769));
SetBackgroundColour(wxColour(175,253,202));
// ... series of controls ... //
Connect(ID_BITMAPBUTTON7,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&SecondPage::OncancelClick);
//*)
printf("sono nella seconda pagina\n");
m_reboot.Bind(wxEVT_TIMER, &SecondPage::Reboot, this);
if (get_day_of_year() == 2 || get_day_of_year() == 4){
secco->Show();
}
sleep(0.5);
signal(SIGALRM,(void (*)(int))kill_child);
pid = fork();
if (pid == 0) {
printf("il pid nel IF: %d\n", pid);
system("play /home/user/Project/audio/scegli-rifiuto.mp3");
exit(0);
}
}
и вот где я пытаюсь убить процесс:
void SecondPage::OnplasticaClick(wxCommandEvent& event)
{
printf("il pid plastica: %d\n", pid);
kill(pid,SIGKILL);
alarm(0.01);
sleep(0.5);
thirdpage = new ThirdPage(nullptr, 2);
thirdpage->selezione="plastica";
strcpy(thirdpage->codice_fiscale, codice_fiscale);
thirdpage->tipologia_rifiuto->SetLabel(thirdpage->selezione);
thirdpage->Refresh();
thirdpage->Update();
thirdpage->m_reboot.StartOnce(600000);
thirdpage->Show(true);
this->Hide();
}