Как я могу реализовать BackgroundWorker в C ++ STL - PullRequest
0 голосов
/ 07 декабря 2018

Здравствуйте, я новичок в C ++, особенно в STL,

Мне нужно создать функцию с бесконечным циклом для вычисления и обработки больших данных (например, Генетический алгоритм), но мне также нужно поддерживайте отзывчивость пользовательского интерфейса и обновляйте его в течение (после каждого раунда) этого бесконечного цикла и запуска / остановки операции вручную.

примерно так:

bool working = false;
void do_process()
{
    while(working)
    {
       // do some stuff
    }
}

void btnStart()
{
    working = true; 
    do_process();
}

void btnEnd()
{
    working = false;
}

не могли бы вы привести меня кправильное решение без какой-либо третьей стороны lib, спасибо.

и извинения за ужасный английский.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Я довольно плохо знаком с c ++, но у меня есть кое-что, что может помочь.Когда я хочу запустить что-то вроде обновления моего кода или запустить что-то внешнее, не заполняя мой исходный проект кодом, я хочу использовать ShellExecute для запуска другой программы на С ++ или внешней программы.Чтобы использовать ShellExecute, вам нужно #include<windows.h>

Например, если я хочу обновить свою программу, я использую #include<fstream>, #include<windows.h> и #include<string>, чтобы проверить значение в файле с именем 'updatereq.txt '(я делаю это сам).И в моей программе я запускаю ifstream, чтобы проверить в файле, есть ли «1».Если оператор if обнаруживает '1', он делает это:

void Update(string filename)
{
    ShellExecute(NULL,"open",filename.c_str(),NULL,NULL,SW_SHOWNORMAL)
}

Это будет выполняться с: HWND, установленным как NULL, Операция, установленной как: "open", Файл, заданный как строка:filename константа, параметры установлены как NULL, каталог установлен как NULL (будет запускаться в каталоге первоначального запуска, обычно в основном файле), а режим установлен как SW_SHOWNORMAL, что будет запускать его перед вами в обычном режиме,Это также SW_SHOWMINIMIZED и SW_SHOWMAXIMIZED

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

PS: Не забудьте указать имя файла / программы, которое вы собираетесь запустить при вызове этой функции

0 голосов
/ 07 декабря 2018

Код ниже должен помочь вам начать.Но будьте осторожны, реализация многопоточного приложения, как правило, является сложной проблемой и для опытных пользователей.Требуется много знаний о синхронизации доступа к памяти и анализе взаимоблокировок.Рассмотрим пример, приведенный ниже, действительно важный.Например, в btnStart и btnStop вы должны проверить, запущен ли поток.Проверка глобального bool working может потребовать синхронизации.Аналогично, проверка на нулевой указатель может потребовать синхронизации.В итоге, это намного сложнее, чем может показаться.

#include <iostream>
#include <utility>
#include <thread>
#include <chrono>
#include <memory>

bool working = false;
std::unique_ptr<std::thread> t;

void do_process()
{
    while(working)
    {
        std::cout << "Hi. I am a secondary thread and I am running.\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(100));
    }
}

void btnStart()
{
    working = true;
    t.reset(new std::thread(do_process)); // start the thread
}

void btnEnd()
{
    working = false;  // inform the thread of termination
    t->join();        // wait for thread termination
    t.reset(NULL);
}

int main()
{
    std::cout << "Hi, I am the main thread.\n";
    std::cout << "I'll now launch another thread and sleep for a while\n";
    btnStart();
    std::this_thread::sleep_for(std::chrono::milliseconds(2000));
    btnEnd();
    std::cout << "What happened while I was slepping?\n";
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...