// бизнес-логика дергает этот метод для копирования в фонеtemplate<class s>void samle::copy(const s& from, const s& to){ // само копирование делаем в фоне const auto background_copying = [this]() { // коллбек вызывается для уведомления текущего прогресса // что бы внешняя сторона могла его как то нарисовать // если бизнес-логика захочет прекратить копирование // данный коллбек вернёт false // если же все хорошо, и нужно копировать дальше, // тогда возвращаем true const auto progress = [this](const size_t bytes) { // рисуем текущее состояние прогресса std::cout << calculateProgressPercentage(bytes, total) << "%\n"; // false - отменить копирование return !this->wasStopped(); } tools::copy(from, to, progress); }; // задача исполняется в отдельной ниточке std::thread(background_copying ).detach();};
// бизнес-логика дергает этот метод для копирования в фоне
void *thread_proc(void *arg){ // Error checking omitted for expository purposes char buffer[BUFSIZE]; int in = open("source_file", O_RDONLY); int out = open("destination_file", O_WRONLY | O_CREAT | O_TRUNC); // Get the input file size struct stat st; fstat(in, &st); progress = 0; max_progress = st.st_size; ssize_t bytes_read; while((bytes_read = read(in, buffer, BUFSIZE)) > 0) { write(out, buffer, BUFSIZE progress += bytes_read; } // copy is done, or an error occurred close(in); close(out); return 0;}void start_file_copy(){ pthread_t t; pthread_create(&t, NULL, &thread_proc, 0);}