从C中的第二个线程绘制图形窗口

时间:2014-12-11 19:00:43

标签: c multithreading graphics codeblocks

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

我一直在尝试使用这个浓缩的代码将来自ObstacleHandler的图形命令传递到主打开的图形窗口。当我运行它时,它会在尝试绘制矩形时立即崩溃。如果我从ObstacleHandler中创建一个窗口,然后绘制矩形,那就没问题了。但是,我需要使用ObstacleHandler在主窗口中绘制矩形。

问题的工作示例:

#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,因为该线程将移动障碍物。

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

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

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

由于

1 个答案:

答案 0 :(得分:2)

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

但我的经验是,如果您从不同的所有者窗口线程访问任何 Windows Visual的东西,那么操作系统中的某些事情会非常错误创造:

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

这适用于任何:

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

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

怎么做?

  1. 创建全局消息队列

    只是您要支持的命令列表

  2. 线程将填满你的问题

    只需向que添加适当的命令,如:重绘窗口,绘制线...,添加到日志......

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

    OnTimerOnIdle事件

  4. <强> [注释]

    如果您使用线程来提高渲染速度,那么您应该渲染到线程局部位图,并在完成时添加命令将其内容复制到目标可视组件。不要忘记que必须是线程安全的,所以添加锁定!!!