相关疑难解决方法(0)

等效的C++到Python生成器模式

我有一些示例Python代码,我需要在C++中模仿它.我不需要任何特定的解决方案(例如基于协同例程的产量解决方案,尽管它们也是可接受的答案),我只需要以某种方式重现语义.

蟒蛇

这是一个基本的序列生成器,显然太大而无法存储物化版本.

def pair_sequence():
    for i in range(2**32):
        for j in range(2**32):
            yield (i, j)
Run Code Online (Sandbox Code Playgroud)

目标是维护上面序列的两个实例,并以半锁步方式迭代它们,但是以块为单位.在下面的示例中,first_pass使用对序列来初始化缓冲区,并second_pass重新生成相同的精确序列并再次处理缓冲区.

def run():
    seq1 = pair_sequence()
    seq2 = pair_sequence()

    buffer = [0] * 1000
    first_pass(seq1, buffer)
    second_pass(seq2, buffer)
    ... repeat ...
Run Code Online (Sandbox Code Playgroud)

C++

我在C++中找到解决方案的唯一方法就是模仿yieldC++协同程序,但我没有找到关于如何做到这一点的任何好的参考.我也对这个问题的替代(非一般)解决方案感兴趣.我没有足够的内存预算来保存传递之间序列的副本.

c++ python yield generator coroutine

101
推荐指数
5
解决办法
4万
查看次数

什么是C++ 20中的协同程序?

什么是中的协同程序?

它与"Parallelism2"或/和"Concurrency2"的不同之处(见下图)?

以下图片来自ISOCPP.

https://isocpp.org/files/img/wg21-timeline-2017-03.png

在此输入图像描述

c++ coroutine c++20

84
推荐指数
2
解决办法
4万
查看次数

处理其他信号时等待信号

我的Qt应用程序与串行设备通信,偶尔必须等待此设备发送一个字节.为了实现这一点,我创建了一个新的eventloop,一旦串行缓冲区中有可用信息就会退出:

unsigned char MyClass::waitForDevice(int timeout)
{
    QEventLoop wait;
    connect(d_serial, SIGNAL(readyRead()), &wait, SLOT(quit()));
    if (timeout > 0)
        QTimer::singleShot(timeout, &wait, SLOT(quit()));

    wait.exec();
    return static_cast<unsigned char>(d_serial->read(1)[0]);
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,当应用程序在等待时,即在eventloop运行时,我需要能够在GUI中按下按钮时与串行设备进行通信.天真地,我尝试将信号连接到执行此操作的插槽,但我发现插槽仅 eventloop终止执行.

我试着,没有任何运气,有一个单独的QThread运行调用qApp->processEvents()无限循环,当eventloop终止时终止.这没用,我不太清楚为什么不呢.解决这个问题的规范方法是什么?

c++ qt

1
推荐指数
1
解决办法
430
查看次数

标签 统计

c++ ×3

coroutine ×2

c++20 ×1

generator ×1

python ×1

qt ×1

yield ×1