我正在使用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作为图形库。但是,不在示例代码中。
我是编程的新手......!任何帮助将不胜感激!
由于
答案 0 :(得分:2)
我使用 Borland / Embarcadero VCL ,所以这不是你的情况!!!
但我的经验是,如果您从不同的所有者窗口线程访问任何 Windows Visual的东西,那么操作系统中的某些事情会非常错误创造:
这适用于任何:
我编码 win32 应用,此行为出现在 XP / SP3 x86,W7 x86,W7 x64(WoW64)上。我没有测试不同的操作系统版本,但怀疑这种行为也存在......
怎么做?
创建全局消息队列
只是您要支持的命令列表
线程将填满你的问题
只需向que添加适当的命令,如:重绘窗口,绘制线...,添加到日志......
主窗口将读取并执行它
在OnTimer
或OnIdle
事件
<强> [注释] 强>
如果您使用线程来提高渲染速度,那么您应该渲染到线程局部位图,并在完成时添加命令将其内容复制到目标可视组件。不要忘记que必须是线程安全的,所以添加锁定!!!