В моем приложении 2 потока - один пользовательский интерфейс, а второй обновляет некоторые данные. Класс второго потока наследует класс wxThread
и имеет некоторые переменные, в частности, Worker *worker
.
class Worker {
public:
virtual void work() {}
};
class WorkerThread : public wxThread {
public:
bool isRunning = true;
Worker *worker;
virtual ExitCode Entry() {
while (isRunning) {
if (worker == nullptr) continue;
worker->work();
usleep(UPDATE_DELAY_USEC);
}
std::cout << "Done\n";
return 0;
}
};
Если я изменю значение рабочего из первого потока на nullptr
, приложение продолжит работать нормально. Если, например, я изменю значение на new Worker()
или на то же значение, что было, приложение просто закроется. Без ошибок выводится на консоль.
Я изменяю этот указатель в wxNotebook
событиях:
void onPageChanged(wxBookCtrlEvent &event) {
switch (event.GetOldSelection()) {
case MNP_PROCESSES:
workerThread->worker = nullptr;
break;
}
switch (event.GetSelection()) {
case MNP_PROCESSES:
workerThread->worker = &processes->worker;
break;
}
}
Вся странная вещь в том, что если я выведу Worker *worker
в глобальную область, то все будет работать нормально, без каких-либо ошибок.
Worker *worker;
class WorkerThread : public wxThread {
...
В чем причина?