gpt4 book ai didi

c - 从 C 中的第二个线程在图形窗口中绘图

转载 作者:太空宇宙 更新时间:2023-11-04 08:33:00 24 4
gpt4 key购买 nike

我正在使用 Codeblocks 在 C 中创建我的第一个图形程序。我正在尝试使用两个线程同时运行两个图形循环。一个用于键盘控制,另一个用于垂直移动矩形。

我一直在尝试使用这段压缩代码将图形命令从 ObstacleHandler 传递到主窗口打开的图形窗口。当我运行它时,它会在尝试绘制矩形时立即崩溃。如果我从 ObstacleHandler 初始化一个窗口,然后绘制矩形,就可以了。但是,我需要 ObstacleHandler 在由 main 初始化的窗口中绘制矩形。

问题的工作示例:

#include <pthread.h>
#include <semaphore.h>
#define NUM_THREADS 2


void *ObstacleHandler(void *threadid)
{
filled_rectangle(100, 120, 100, 120);
update_display();
pthread_exit(NULL);
return 0;
}

int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
long t;
for(t=0;t<NUM_THREADS;t++)
{
printf("In main: creating thread %ld\n", t + 1);
}

pthread_create(&threads[1], NULL, ObstacleHandler, (void *)1);
initwindow(640, 480);
pthread_exit(NULL);
return 0;
}

必须使用 main 函数打开窗口,因为其中有键盘命令。我无法将它们移动到 ObstacleHandler,因为该线程将移动障碍物。

另外,有没有一种方法可以打开两个图形窗口并且每个窗口都有唯一的标识?即 graph1 和 graph2。

我正在使用 allegro 作为图形库。但是,示例代码中没有。

我是编程新手,所以...!任何帮助将不胜感激!

谢谢

最佳答案

我使用 Borland/Embarcadero VCL 所以这不可能是你的情况!!!

但我的经验是,如果您从不同的所有者窗口线程访问任何Windows Visual 东西,那么操作系统就会出现严重错误> 创建:

  • 视觉伪影
  • 随机无关的崩溃
  • 整个应用程序的意外行为

这适用于任何:

  • winapi调用与窗口可视化组件相关
  • 绘制到窗口
  • 对可视组件的任何访问(例如向备忘录添加行、更改某些内容的颜色...)

我编写 win32 应用程序并且此行为出现在 XP/SP3 x86、W7 x86、W7 x64(WoW64) 上。我没有测试不同的操作系统版本,但怀疑那里也存在这种行为......

怎么办?

  1. 创建您的全局消息队列

    只是你想要支持的命令列表

  2. 线程将填补你的问题

    只需在队列中添加适当的命令,例如:重绘窗口、画线...、添加到日志...

  3. 主窗口将读取并执行它

    OnTimerOnIdle 事件中

[注释]

如果您使用线程来提高渲染速度,那么您应该渲染到线程本地位图,完成后添加命令以将其内容复制到目标可视组件。不要忘记队列必须是线程安全的,所以要给它加锁!!!

关于c - 从 C 中的第二个线程在图形窗口中绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27430407/

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