wxWidgets wxThread Удалить для присоединяемой темы - PullRequest
0 голосов
/ 25 апреля 2011

У меня есть вопрос о присоединяемых потоках в wxWidgets.

Когда пользователь хочет этого, я хочу остановить поток, выполняющий некоторую работу.По этой причине я вызываю в этом рабочем потоке TestDestroy (), чтобы проверить, должен ли поток быть остановлен.Но я могу остановить поток только таким способом, вызвав Delete (), который не должен вызываться для присоединяемых потоков.

Есть ли возможность остановить поток (используя TestDestroy) или мне нужно изменитьмой код полностью?

Заранее спасибо,

TiBo

Ответы [ 3 ]

1 голос
/ 25 апреля 2011

Вы должны вызвать метод Exit () из вашего рабочего потока или просто вернуться из метода Run и вызвать метод MyThread-> Wait (), а затем удалить объект потока.

Объявление потока:

class MyThread : public wxThread {
  virtual void * run();
};

Реализация потока:

MyThread::run()
{
  while(1)
  {
    if(TestDestroy())
    {
        this.Exit();  // or return;
    }
    // Do some work
  }
}

Объявление указателя потока:

MyThread * pMyThread;

Создание, запуск и остановка потока

void launchThread{
  pMyThread = new wxThread(wxTHREAD_JOINABLE);
  pMyThread->Create();
  pMyThread->Run();
}

void stopThread(){
  pMyThread->Delete();
  pMyThread->Wait();
  delete pMyThread;
}

Надеюсь, что это поможет.

PS: это мой первый ответ на переполнение стека.Я не знаю, как я могу легко написать какой-нибудь код с автоматическим отступом?

0 голосов
/ 25 апреля 2011

Текущая документация для wxThread :: Delete () гласит:

Эта функция работает с присоединяемым потоком, но в этом случае делает функцию TestDestroy () потокаверните true и затем ожидает его завершения (то есть он отличается от Wait (), потому что он просит поток завершиться перед ожиданием).

Итак, похоже, что вы можете использовать Delete() для присоединяемогонить.

0 голосов
/ 25 апреля 2011

Вам не нужно переписывать свой код.

Как правило, лучше всего завершать поток, возвращаясь из своей основной функции, как предлагается в документации.

Один из способов достижения этого, и, возможно, самый простой, - это бросить какой-нибудь объект, который будет пойман в функции основного потока.

Например:

struct ThreadEndingException { };

void DoSomeWork() {
    ...
    if (TestDestroy())
        throw ThreadEndingException();
    ...
}

void ThreadFunction() {
    try {
        DoSomeWork();
    }
    catch (const ThreadEndingException&) {
        // Do nothing, the function will return after leaving this catch.
    }
}
...