gpt4 book ai didi

c++ - 2个并行线程运行,每个线程控制一个设备。我可以用什么来实现它?

转载 作者:行者123 更新时间:2023-11-28 01:29:59 26 4
gpt4 key购买 nike

我的设备是相机。

我希望能够启动thread one,并在该线程中为device one 运行类似于状态机的东西。 设备二也是如此。

到目前为止,我已经为设备编写了所有控制函数。我可以完全在两个不同的线程中运行它们。我需要做的是能够从主线程控制它们。

对于我的控制线程,我创建了一个 while 循环,该循环始终为真,除非传递了对应于 break 循环的对变量的原子引用。

我想从主线程做的是向thread one 发送一条命令,说要捕获一个帧。捕获一帧需要 10ms。在捕获第一帧的过程中,我想向 thread two 发送命令以捕获帧并继续这样做。

void classA::Capture(WINUSB_INTERFACE_HANDLE * handle, std::atomic<int>& cap)
{
std::vector<byte> frame;

while (true)
{
if (cap == 1)
{
frame = CaptureFrame(*handle);
cap = 0;
}
else if (cap == 2)
}
}

void ClassA::run()
{
std::vector<WINUSB_INTERFACE_HANDLE> devices = GetHandles();

Initialize(devices[0]);
Initialize(devices[1]);

WINUSB_INTERFACE_HANDLE h1 = devices[0];
WINUSB_INTERFACE_HANDLE h2 = devices[1];

std::atomic<int> cap1{ 0 };
std::atomic<int> cap2{ 0 };

std::thread t1(&ClassA::Capture,this, &h1, &n1, ref(cap1));
std::thread t2(&ClassA::Capture,this, &h2, &n2, ref(cap2));

for (int c = 0; c < 2000; c++)
{
if (c % 2 == 0)
{
cap1 = 1;
Sleep(5);
}
else
{
cap2 = 1;
Sleep(5);
}
}

cap1 = 2;
cap2 = 2;
t1.join();
t2.join();

}

最终发生的是,有时设备以正确的顺序工作并像 121212 那样抓取帧,但有时设备会跳过并执行此操作 1211221。(1 我的意思是设备一,2 设备 2,捕获顺序)

环顾四周后,我找到了 std::queue 但我不确定如何实现它。非常感谢。对于造成的困惑,我深表歉意。任何帮助表示赞赏。

最佳答案

如果保持帧捕获的“121212”顺序绝对重要,那么您将需要比现有更多的东西。特别是,两个捕获线程都需要等待它们的 10 毫秒心跳,但它们还需要确保另一个摄像头已捕获帧。

你有这个正确的基础,因为你有正确的线程来执行所涉及的任务,但是这些线程需要更复杂一些。这将是伪代码而不是实际的 C++,但它应该提供一个基础。

您需要四个“事件”——这些可以使用原始 Win32 EVENT 来完成,或者对于平台不可知的版本,一个 std::mutex 和一个 std::condition_variable 将完成工作。事件是 capture1 capture2 started1started2capture 事件被主线程用来触发帧捕获,started 事件通知主线程适当的捕获线程实际上已经开始捕获帧。

主要控制代码:

// create all four events.

std::thread t1(&ClassA::Capture,this, &h1, &n1, ref(trigger1), ref(started1));
std::thread t2(&ClassA::Capture,this, &h2, &n2, ref(trigger2), ref(started2));

for (int c = 0; c < 2000; c++)
{
PostEvent(trigger1);
WaitForEvent(started1);
Sleep(5);
PostEvent(trigger2);
WaitForEvent(started2);
Sleep(5);
}

然后你的线程循环看起来像这样:

void classA::Capture(WINUSB_INTERFACE_HANDLE * handle, Event& trigger, Event& started)
{
std::vector<byte> frame;

while (true)
{
WaitForEvent(trigger);
PostEvent(started);
// Did you really mean to return the frame as a vector<byte> by value?
// That's not going to perform well, consider passing frame by reference into CaptureFrame()
frame = CaptureFrame(*handle);
}
}

适用标准免责声明:此代码尚未编译,并且可能不会按原样编译:您需要那个 Event 对象才能使其工作。

关于c++ - 2个并行线程运行,每个线程控制一个设备。我可以用什么来实现它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51940298/

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