0

在我的基于 SDL2 的程序中,我有一个处理事件队列的主线程,以及另一个定期将事件推送给它的线程。

// thread #2
event.type = UserEventType;
event.user.code = SomeCode;
event.user.data = UInt8Value;
SDL_PushEvent(&event);

主线程获取此事件,并提取数据。

// main thread
SDL_PollEvent(&event); /* ... */
Uint8 Uint8Value = event.user.data;

这个解决方案似乎并不好,因为 Uint8 和 void* 的大小不同,并且取决于平台。最安全的方法是在堆中分配 Uint8 值并通过 event.user.data 将指针传递给它,并在主线程中释放内存。但是,当您只需要传递一个字节时,为每个事件分配/释放内存不是效率低吗?也许有一个更好的解决方案也是便携的?

4

2 回答 2

0

形成一个循环队列的事件容器怎么样?您可以加载下一个空闲元素,然后将其地址推送到队列中。然后消费者/主可以取消引用它。它仍然是低效的,但至少你避免了新/删除微小结构的痛苦。

于 2013-11-08T13:01:29.323 回答
0

这是一种方法

//  All the possible character values
// Make this a global
char dummy_values[256];


// thread #2
event.type = UserEventType;
event.user.code = SomeCode;
event.user.data = dummy_values + UInt8Value;
SDL_PushEvent(&event);


// main thread
SDL_PollEvent(&event); /* ... */
Uint8 Uint8Value = static_cast<char*>(event.user.data) - dummy_values;

这是一个 256 字节数组的成本,但它避免了动态内存,并且应该是安全和可移植的

于 2013-11-08T13:23:41.450 回答