Убить дочерний процесс в C и Wxwidgets - PullRequest
0 голосов
/ 07 октября 2019

Я использую 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();
}
...