从C中的第二个线程在图形窗口中绘制
我正在用C语言创建我的第一个图形程序,使用代码块。我正在尝试使用两个线程同时运行两个图形循环。一个用于键盘控制,另一个用于垂直移动矩形 我一直在尝试使用这段压缩的代码,将图形命令从ObstacleHandler传递到main打开的图形窗口。当我运行它时,只要它尝试绘制矩形,它就会崩溃。如果我从ObstacleHandler初始化一个窗口,然后绘制矩形,就可以了。但是,我需要ObstacleHandler在由main初始化的窗口中绘制矩形 该问题的工作实例:从C中的第二个线程在图形窗口中绘制,c,multithreading,graphics,codeblocks,C,Multithreading,Graphics,Codeblocks,我正在用C语言创建我的第一个图形程序,使用代码块。我正在尝试使用两个线程同时运行两个图形循环。一个用于键盘控制,另一个用于垂直移动矩形 我一直在尝试使用这段压缩的代码,将图形命令从ObstacleHandler传递到main打开的图形窗口。当我运行它时,只要它尝试绘制矩形,它就会崩溃。如果我从ObstacleHandler初始化一个窗口,然后绘制矩形,就可以了。但是,我需要ObstacleHandler在由main初始化的窗口中绘制矩形 该问题的工作实例: #include <pthrea
#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必须是线程安全的,因此请为其添加锁!!!您能提供一个最小的可编译示例吗?还请添加您需要的图形库类型正在使用。我已在中添加了信息。谢谢