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

从C中的第二个线程在图形窗口中绘制,c,multithreading,graphics,codeblocks,C,Multithreading,Graphics,Codeblocks,我正在用C语言创建我的第一个图形程序,使用代码块。我正在尝试使用两个线程同时运行两个图形循环。一个用于键盘控制,另一个用于垂直移动矩形 我一直在尝试使用这段压缩的代码,将图形命令从ObstacleHandler传递到main打开的图形窗口。当我运行它时,只要它尝试绘制矩形,它就会崩溃。如果我从ObstacleHandler初始化一个窗口,然后绘制矩形,就可以了。但是,我需要ObstacleHandler在由main初始化的窗口中绘制矩形 该问题的工作实例: #include <pthrea

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

我一直在尝试使用这段压缩的代码,将图形命令从ObstacleHandler传递到main打开的图形窗口。当我运行它时,只要它尝试绘制矩形,它就会崩溃。如果我从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;
}
#包括
#包括
#定义NUM_线程2
void*ObstacleHandler(void*threadid)
{
填充矩形(100120100120);
更新_display();
pthread_exit(NULL);
返回0;
}
int main(int argc,char*argv[])
{
pthread_t threads[NUM_threads];
长t;

对于(t=0;t我使用Borland/Embarcadero VCL,所以这不可能是你的情况

但我的经验是,如果您从不同的所有者窗口线程访问任何Windows可视内容,则操作系统中会出现严重错误,从而导致:

  • 视觉伪影
  • 随机无关碰撞
  • 整个应用程序的意外行为
这适用于任何:

  • winapi与窗口的可视组件相关的调用
  • 绘图到窗口
  • 对可视组件的任何访问(如在备忘录中添加行、更改某物的颜色等)
我编写了win32应用程序,该行为出现在XP/SP3 x86、W7 x86、W7 x64(WoW64)
上。我没有测试不同的操作系统版本,但怀疑该行为也存在

怎么办?

  • 创建您的全局消息

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

  • 线程将填充您的队列

    只需在que中添加适当的命令,如:重画窗口、绘制线…、添加到日志

  • 主窗口将读取并执行它

    内部
    OnTimer
    OnIdle
    事件

  • [Notes]


    如果您使用线程来提高渲染速度,那么您应该改为渲染到线程本地位图,并在完成后添加命令以将其内容复制到目标视觉组件。不要忘记que必须是线程安全的,因此请为其添加锁!!!

    您能提供一个最小的可编译示例吗?还请添加您需要的图形库类型正在使用。我已在中添加了信息。谢谢