Как создать несколько задач, каждая из которых в отдельном потоке? - PullRequest
0 голосов
/ 09 мая 2018

У меня есть два статических метода:

  • bool getPicture(const std::string url, const std::string keywords ="")
  • bool showPicture(wxStaticBitmap *viewer)

Каждый из этих методов выполняет отдельную задачу, поэтому я хочу, чтобы каждый из них выполнялся в отдельном потоке.

#include <wx/thread.h>

// Declaration

class CThread : public wxThread {
public:
    CThread() = default;
    ~CThread() = default;
    void *Entry();
};

// Implementation

void* CThread::Entry() {
    CPublic::getPicture(mainFrm::getInstance()->targetURL, CPublic::getConfigItem("settings/keywords").ToStdString());
    // CPublic::showPicture(mainFrm::getInstance()->viewer_btmp);
    return 0;
}

// Create an instance

wxThread *th = new CThread();
th->Create();
th->Run();

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

Нужно ли создавать другой класс, который имеет другой метод Entry() , чтобы поместить в него мой метод showPicture() , который будет выполняться в другом отдельном потоке или есть другой способ?

1 Ответ

0 голосов
/ 09 мая 2018

Быстрый ответ:
Все экземпляры класса (wxThread - это класс) совместно используют его методы. Поэтому, если вам нужен другой Entry(), вам нужен новый производный от wxThread класс.

Советы по многопоточности:
Хотя getPicture() может выполняться во вторичном потоке, showPicture() должен выполняться в главном потоке, потому что это правильное место для рисования в окне. Настоятельно рекомендуется делать все графические элементы только в основном потоке.
Редким исключением является использование OpenGL во вторичном потоке вместо рисования командами ОС.

Дело в том, что вторичный поток отправляет сообщение в основной поток, говоря: «Я закончил, изображение доступно».
Новые данные (обработанное изображение) могут быть помещены в место, где их может прочитать основной поток (например, окно, которое будет их рисовать).
Запретить доступ любого другого потока к данным во время записи рабочего потока (для getPicture()), используя wxCriticalSectionLocker.

Больше информации на wxWidgets docs , больше wxWidgets doc и thread образец, поставляемый с дистрибутивом wxWidgets.

...