Странное поведение при многопоточности с использованием wxWidgets - PullRequest
1 голос
/ 09 июня 2019

В моем приложении 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 {
    ...

В чем причина?

1 Ответ

0 голосов
/ 10 июня 2019

Проблема была решена.Я искал проблему там, где ее нет.Проблема заключалась в том, что я сначала создал wxNotebook, соответственно, был вызван onPageChanged, в котором изменился указатель, принадлежащий классу, который еще не был создан.

...