1

我正在使用基于while(true)阻塞函数的三个线程创建应用程序模型。

  1. 事件线程 - 等待用户输入,被 SDL_WaitEvent 阻塞
  2. Socked 线程 - 等待来自服务器的数据,被阻塞套接字阻塞。
  3. 渲染线程 - 从缓冲区渲染数据,而不是阻塞。

我在渲染线程时遇到了问题——我需要一个阻塞函数,例如,它会阻塞直到某个绘制事件(由我定义并在其他两个线程之一中调度)发生。
但我不知道阻塞函数是如何工作的。当然,我可以创建一个sleep()循环,但这样的循环固定 FPS 占用资源,即使没有发生任何事情(我已经在此处详细阐述了该主题)。另一方面,它不会立即显示数据。这对 GUI 应用程序不利。

4

2 回答 2

3

如果您使用的是 C++11,则可以使用std::condition_variableand std::mutex

void
waitForEvent()
{
    std::unique_lock<std::mutex> lock( myMutex );
    while ( ! externalCondition ) {
        myConditionVariable.wait( lock );
    }
}

要触发事件:

void
setEvent()
{
    std::unique_lock<std::mutex> lock( myMutex );
    setExternalCondition();
}

另一方面,您提到了 GUI 和渲染器。您 不能等待 GUI 线程中的外部条件。如果您需要在 GUI 线程中进行渲染,则必须了解如何在 GUI 管理器中创建 GUI 事件,并发布 GUI 事件。

于 2013-02-04T17:42:26.493 回答
0

看起来不错。有多平台版本吗?或者至少,相当于linux,所以我可以自己写一个?

看看这个线程:WaitForSingleObject 和 WaitForMultipleObjects 等效于 linux

坚持使用 pthread_cond_timedwait 并使用 clock_gettime。例如:

struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 10; // ten seconds
while (!some_condition && ret == 0)
    ret = pthread_cond_timedwait(&cond, &mutex, &ts);
于 2013-02-04T16:41:56.957 回答