繁体   English   中英

使用pthreads创建独立的绘制线程(C ++)

[英]Creating an independent draw thread using pthreads (C++)

我正在开发一个图形应用程序,它看起来像这样:

while (Simulator.simulating)
{
    Simulator.update();
    InputManager.processInput();
    VideoManager.draw();
}

我每秒这样做几次,并且在大多数情况下,我的计算将占用我90-99%的处理时间。 我想做的是取出processInput和draw函数,并使每个函数独立运行。

这样,我可以让输入线程始终检查输入(以合理的速率),而绘制线程尝试以给定的帧速率重新绘制。

该模拟器已经(内部)是多线程的,并且多个线程写入同一数据没有问题(每个线程处理一个段)。

我的问题是我不确定如何正确执行此操作。 如何正确初始化我的pthread_t和关联的pthread_attr_t,以使线程运行而不会阻塞我在做什么? 换句话说,如何创建两个线程,每个线程运行一个无限循环?

为了进一步概括,我正在尝试找出方法:

for (int i = 0; i < threads; i++)
    pthread_create(&th[i], NULL, func[i], NULL)

for (int i = 0; i < threads; i++)
    pthread_join(th[i], NULL);

其中func [i]是一些任意函数,它在无限循环中运行以执行某些任意操作。

任何帮助,甚至链接,不胜感激,谢谢!

编辑:我应该提到这是一个交互式模拟器,因此我确实需要有两个彼此独立运行的无限循环。 我似乎只能一次跑步。

双缓冲是您的朋友。 有2个数据缓冲区。 一种是绘图缓冲区,一种是计算缓冲区。 完成计算后,请等待当前绘制完成,然后再交换缓冲区。 现在,当您计算下一帧数据时,它将继续绘制新计算的数据。 现在,绘图和模拟几乎完全解耦了...

首先,我建议使用boost :: thread而不是pthread,因为您使用的是C ++。 使用boost::thread您可以执行以下操作:

#include <boost/thread.hpp>

void input_thread()
{
    //...
}

void draw_thread()
{
    //...
}

int main()
{
    boost::thread input_th(&input_thread);
    boost::thread draw_th(&draw_thread);

    input_th.join();
    draw_th.join();

    return 0;
}

boost::thread的构造函数会自动产生一个新线程并调用传入的函数。您还可以通过使用boost :: bind将成员函数用作线程。 连接功能将阻塞,直到线程退出。 这是必需的,因为如果main()退出,则将杀死所有线程。

希望这可以帮助您入门,但是最困难的部分是同步(在线程之间共享数据)。 我建议您查看互斥和条件变量的文档 请记住,您需要确保仅一个线程一次写入同一内​​存位置。 互斥体可以解决此问题。 条件变量通过允许您在线程之间发信号并等待信号来提供帮助。

例如,在输入线程中,您可以使用输入填充缓冲区,然后使用条件变量向绘制线程发送信号,表明输入已准备就绪。 在每个线程中,访问缓冲区时均应锁定一个互斥体,以使在绘制线程尝试读取该互斥体时,它不会被输入线程覆盖。 正如Goz所建议的,双缓冲区将使此操作更容易并且可能更有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM