private:
int result;
std::thread* workerThread;
bool resultReady;
public:
workerThread(nullptr), resultReady(false) {}
~AsyncCalculator() {
if (workerThread && workerThread->joinable()) {
workerThread->join();
delete workerThread;
}
}
bool startCalculation(int a, int b) {
return false;
}
resultReady = false;
workerThread = new std::thread([this, a, b]() {
std::this_thread::sleep_for(std::chrono::seconds(2));
if (rand() % 10 < 8) {
result = a * b + (a + b);
resultReady = true;
completed(result);
} else {
failed();
}
});
return true;
}
bool get(int& outResult, int timeout) override {
if (!waitDone(timeout)) {
return false;
}
outResult = result;
return true;
}
return false;
}
bool setWait(void) override {
return true;
}
return false;
}
bool waitDone(int timeout) override {
if (isDone()) {
return true;
}
if (!workerThread) {
return false;
}
if (timeout == 0) {
workerThread->join();
return isDone();
} else {
auto start = std::chrono::steady_clock::now();
while (!isDone()) {
std::this_thread::sleep_for(std::chrono::milliseconds(10));
auto elapsed = std::chrono::steady_clock::now() - start;
if (std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count() >= timeout) {
return false;
}
}
return true;
}
}
void clear(void) override {
if (workerThread && workerThread->joinable()) {
workerThread->join();
delete workerThread;
workerThread = nullptr;
}
result = 0;
resultReady = false;
}
return status;
}
void completed(int result) override {
std::cout << "計算完成,結果: " << result << std::endl;
}
void failed(void) override {
std::cout << "計算失敗" << std::endl;
}
};
AsyncCalculator calculator;
std::cout << "開始異步計算..." << std::endl;
if (calculator.startCalculation(15, 25)) {
std::cout << "是否忙碌: " << calculator.isBusy() << std::endl;
std::cout << "是否完成: " << calculator.isDone() << std::endl;
if (calculator.waitDone(5000)) {
std::cout << "操作完成" << std::endl;
if (calculator.isCompleted()) {
int result;
if (calculator.get(result)) {
std::cout << "計算結果: " << result << std::endl;
}
} else if (calculator.isFailed()) {
std::cout << "計算失敗" << std::endl;
}
} else {
std::cout << "等待超時" << std::endl;
}
}
private:
std::string content;
std::string filename;
public:
bool readFile(const std::string& file) {
if (!isIdle()) {
return false;
}
filename = file;
setWait();
std::thread([this]() {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
if (filename != "nonexistent.txt") {
content = "File content from " + filename;
completed(content);
} else {
failed();
}
}).detach();
return true;
}
};
AsyncFileReader fileReader;
if (fileReader.readFile("config.txt")) {
if (fileReader.waitDone()) {
if (fileReader.isCompleted()) {
std::string content;
if (fileReader.get(content)) {
std::cout << "讀取內容: " << content << std::endl;
}
}
}
}
class FutureManager {
private:
std::vector<std::unique_ptr<ufm::util::Future<int>>> futures;
public:
futures.push_back(std::move(future));
}
void waitAll(int timeout) {
std::cout << "等待所有操作完成..." << std::endl;
for (auto& future : futures) {
if (future->waitDone(timeout)) {
if (future->isCompleted()) {
int result;
if (future->get(result)) {
std::cout << "結果: " << result << std::endl;
}
} else if (future->isFailed()) {
std::cout << "操作失敗" << std::endl;
}
} else {
std::cout << "操作超時" << std::endl;
}
}
}
void clearAll() {
for (auto& future : futures) {
future->clear();
}
futures.clear();
}
};
FutureStatus
異步操作狀態列舉,定義 Future 物件的所有可能狀態。
Definition FutureStatus.h:239
@ DONE_COMPLETED
成功完成狀態,操作已成功完成並可獲取結果
@ DONE_FAILED
失敗狀態,操作執行過程中發生錯誤
非同步操作結果介面,提供異步任務的監控和結果獲取功能。
Definition Future.h:310