gpt4 book ai didi

c++ - 如何在异步线程中中断?

转载 作者:行者123 更新时间:2023-11-30 05:19:47 25 4
gpt4 key购买 nike

我正在尝试为我的项目制作一些异步线程。

我想知道是否有可能通过中断等方式完成“任务 5”。

是否可以在已经运行的“call_from_async”中更改 itv_duration?

#include <iostream>
#include <future>
#include <vector>

using namespace std;

enum class status{
STATUS_REVICE = 0,
STATUS_START = 1,
STATUS_COMPLETED = 2,
STATUS_CANCELED = 3
};

int called_from_async(std::string taskName, int creationTime, int itv_duration, int itv_start)
{
cout << "creationTime : " << creationTime << endl;
cout << "interval : " << itv_duration << endl;
cout << "startTime : " << itv_start << endl;

cout << "status : 1 Event Recevied" << endl;

bool bExit = false;
bool bStart = false;

while(!bExit)
{
if(creationTime > itv_start && !bStart)
{
bStart = true;
}

creationTime++;

if(bStart)
{
itv_duration--;
if(itv_duration < 0 )
{
bExit = true;
}
}

std::this_thread::sleep_for(std::chrono::seconds(1));
}

cout << "status : 3 Event Completed : " << taskName.c_str() << endl;

return 1;
}

class eventManager
{
public:
eventManager() {};
~eventManager() {};

std::future<int> addTask(std::string taskName, int creationTime, int itv_duration, int itv_start)
{
return std::async(std::launch::async, called_from_async, taskName, creationTime, itv_duration, itv_start);
}

private:
};

int main() {

std::vector<std::future<int>> futures; // place for asyns tasks

eventManager evtManager;

futures.push_back(std::move(evtManager.addTask("Task 1", 1234560, 20, 1234570))); // will be done as 4th
futures.push_back(std::move(evtManager.addTask("Task 2", 1234560, 15, 1234570))); // will be done as third
futures.push_back(std::move(evtManager.addTask("Task 3", 1234560, 10, 1234570))); // will be done as second
futures.push_back(std::move(evtManager.addTask("Task 4", 1234560, 5, 1234570))); // will be done as first
futures.push_back(std::move(evtManager.addTask("Task 5", 1234560, 360, 1234570))); // super long task, but will be done as zero because of cancel event.

return 0;

最佳答案

您可以通过引用而不是通过值来传递持续时间(您希望在执行期间更改的变量)。

创建一个专用变量来处理取消也是一个好主意。我在下面的示例中使用了一个简单的 bool,但您可能会考虑更花哨的东西,例如 std::condition_variable

int called_from_async(std::string taskName, int creationTime, int& itv_duration, int itv_start, bool& cancel)
{
bool bExit = false;
bool bStart = false;
while (!bExit && !cancel)
{
if (creationTime > itv_start && !bStart)
{
bStart = true;
}

creationTime++;

if (bStart)
{
if (--itv_duration < 0)
{
bExit = true;
}
}

std::this_thread::sleep_for(std::chrono::seconds(1));
}

std::cout << taskName << std::endl;

return 1;
}

class eventManager
{
public:
eventManager() { };
~eventManager() { };

std::future<int> addTask(std::string taskName, int creationTime, int& itv_duration, int itv_start, bool& cancel)
{
return std::async(std::launch::async, [=, &itv_duration, &cancel]() { return called_from_async(taskName, creationTime, itv_duration, itv_start, cancel); });
}
};

int main()
{

std::vector<std::future<int>> futures; // place for asyns tasks

eventManager evtManager;

bool cancel1 = false, cancel5 = false;
int shortDuration = 2, longDuration = 360;
futures.push_back(std::move(evtManager.addTask("Task 1", 1234560, shortDuration, 1234570, cancel1))); // will be done as 4th
//...
futures.push_back(std::move(evtManager.addTask("Task 5", 1234560, longDuration, 1234570, cancel5))); // super long task, but will be done as zero because of cancel event.

longDuration = 1;
//cancel5 = true;

//wait for your tasks to finish, so that references are valid
//or declare them in the higher scope

return 0;
}

关于c++ - 如何在异步线程中中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40969579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com