gpt4 book ai didi

c - Pthread Xlib编程

转载 作者:太空宇宙 更新时间:2023-11-04 02:14:01 25 4
gpt4 key购买 nike

我对 pthread 和 xlib 编程还很陌生。我试图在相反的方向绘制和移动两组矩形,但是当我运行我的代码时我的问题是只执行一个线程而另一个线程被忽略。

我尝试了多种选择,但都无济于事。任何建议将不胜感激。

我已经包含了我的源代码。

谢谢。

编译:gcc -o Demofinal Demofinal.c -lpthread -lX11

运行:./Demofinal

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
#include <pthread.h>
//Compile gcc -o Demofinal Demofinal.c -lpthread -lX11
//Run ./Demofinal

Display *dis;
Window win;
XEvent report;
GC green_gc;
XColor green_col;
Colormap colormap;
pthread_mutex_t mutexsum;

char green[] = "#00FF00";
void *createMoveLogs( void *ptr );
typedef struct str_thdata
{
int xval;
int yval;
int dir;
} thdata;

int main() {

pthread_t mvleft, mvright;
thdata data1, data2;

/* initialize data to pass to thread 1 and 2*/
data1.xval = 600;
data1.yval = 115;
data1.dir = 0;

data2.xval = 5;
data2.yval = 250;
data2.dir = 1;



dis = XOpenDisplay(NULL);
win = XCreateSimpleWindow(dis, RootWindow(dis, 0), 1, 1, 550, 550, 0, WhitePixel (dis, 0), WhitePixel(dis, 0));
XMapWindow(dis, win);
colormap = DefaultColormap(dis, 0);
green_gc = XCreateGC(dis, win, 0, 0);
XParseColor(dis, colormap, green, &green_col);
XAllocColor(dis, colormap, &green_col);
XSetForeground(dis, green_gc, green_col.pixel);

pthread_create( &mvleft, NULL, createMoveLogs, (void*) &data1);//thread 1 move right to left
pthread_create( &mvright, NULL, createMoveLogs, (void*) &data2);//thread 2 move left to right
pthread_join(mvleft, NULL);
pthread_join(mvright, NULL);
return 0;
}

void *createMoveLogs( void *ptr )
{
thdata *data;
data = (thdata *) ptr;

int x= data->xval; int y = data->yval; int i;
int direction = data->dir;
//check if the direction to move == left
if(direction == 0){
pthread_mutex_lock(&mutexsum);
for(i=0; i<=600; i++){
XDrawRectangle(dis, win, green_gc, x, y, 145, 50);
XDrawRectangle(dis, win, green_gc, x+200, y, 145, 50);
XDrawRectangle(dis, win, green_gc, x+400, y, 145, 50);
x-=10;
if (x==-500){x=data->xval; i=0;}

usleep(100000);
XFlush(dis);
XClearWindow(dis, win);
}
pthread_mutex_unlock(&mutexsum);
}else if(direction == 1){
pthread_mutex_lock(&mutexsum);
for(i=0; i<=600; i++){

XDrawRectangle(dis, win, green_gc, x, y, 145, 50);
XDrawRectangle(dis, win, green_gc, x-200, y, 145, 50);
XDrawRectangle(dis, win, green_gc, x-400, y, 145, 50);
x+=10;
if (x==855){x=5; i=0;}
usleep(100000);
XFlush(dis);
XClearWindow(dis, win);
}
pthread_mutex_lock(&mutexsum);
}
}

最佳答案

如果您对闪光灯敏感,请勿运行此程序。

XInitThreads(); 
...

if(direction == 0){
for(i=0; i<=600; i++){
pthread_mutex_lock(&mutexsum);
printf ("Thread %d\n", direction);
XDrawRectangle(dis, win, green_gc, x, y, 145, 50);
XDrawRectangle(dis, win, green_gc, x+200, y, 145, 50);
XDrawRectangle(dis, win, green_gc, x+400, y, 145, 50);
x-=10;
if (x==-500){x=data->xval; i=0;}

XFlush(dis);
XClearWindow(dis, win);
usleep(50000);
pthread_mutex_unlock(&mutexsum);
usleep(50000);
}
}else if(direction == 1){
for(i=0; i<=600; i++){
pthread_mutex_lock(&mutexsum);
printf ("Thread %d\n", direction);
XDrawRectangle(dis, win, green_gc, x, y, 145, 50);
XDrawRectangle(dis, win, green_gc, x-200, y, 145, 50);
XDrawRectangle(dis, win, green_gc, x-400, y, 145, 50);
x+=10;
if (x==855){x=5; i=0;}
XFlush(dis);
XClearWindow(dis, win);
usleep(50000);
pthread_mutex_unlock(&mutexsum);
usleep(50000);
}
}

这会显示两组移动矩形。当然,该方法完全是野蛮的,因为 XClearWindow() 会导致持续闪烁。在实际程序中,每个线程都负责清除旧框架中它自己的部分,而不会触及其他线程的部分。

关于c - Pthread Xlib编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10160245/

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