df_0903
Зарегистрирован: 23.09.2005 Сообщения: 1
|
Добавлено: Пт Сен 23 2005 10:41 Заголовок сообщения: Почему не работает эта программа? |
|
|
Задавал этот вопрос на LOR. Народ даже не понял о чем речь
Почему эта программа работает только при NUM_THREADS < 8?
Лучше всего запустить и посмотреть. Завершается по ошибке Xlib.
Причем ошибки могут быть разные. Например
Код: |
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 4 (X_DestroyWindow)
Resource id in failed request: 0x5400001
Serial number of failed request: 17
Current serial number in output stream: 19
|
Хотя могут быть и другие. Это зависит от количества потоков и порядка вызова
функций.
Неужели Xlib нельзя использовать в многопоточных приложениях таким образом.
P.S. XLockDisplay не помогает
Компилится g++ -pthread -Wall -W -D_REENTRANT c.cpp -o c -L/usr/X11R6/lib -lpthread -lc -lX11
//------------------------------------------
Код: |
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<pthread.h>
#include<sys/time.h>
#include <X11/Xlib.h>
#include<X11/Xutil.h>
#include <X11/cursorfont.h>
#include <X11/keysym.h>
#include <X11/Xatom.h>
#include <X11/Xcms.h>
#define NUM_THREADS 20
inline unsigned long long get_time()
{
struct timeval tv;
gettimeofday(&tv,NULL);
return ((unsigned long long)tv.tv_sec*1000000L+(unsigned long long)tv.tv_usec);
}
void* func(void* =NULL)
{
Display* xdpy=XOpenDisplay(NULL);
int screen =DefaultScreen(xdpy);
Window root=RootWindow(xdpy,screen);
char tmp[256];
sprintf(tmp,"Thread %lu",pthread_self());
int tlen=strlen(tmp);
XcmsColor Color;
Color.format=XcmsRGBFormat;
Color.spec.RGB.blue=random()*100;
Color.spec.RGB.green=random()*100;
Color.spec.RGB.blue=random()*100;
XcmsAllocColor(xdpy,DefaultColormap(xdpy,screen),&Color,XcmsRGBFormat);
Window win=XCreateSimpleWindow(xdpy,root,100,100,400,100,6,BlackPixel(xdpy,scre en),Colo r.pixel);
XSelectInput(xdpy,win,ExposureMask | KeyPressMask );
XMapWindow(xdpy,win);
GC gc=XCreateGC(xdpy,win,0,NULL);//GCForeground|GCFunction,&gcv);
XEvent event;
unsigned long long ti=get_time();
while(1)
{
while(!XPending(xdpy))
{
if((get_time()-ti)>190000)
goto endL;
sched_yield();
}
XNextEvent(xdpy, &event);
if (XFilterEvent(&event, None))
continue;
switch(event.type)
{
case KeyPress:
{
char wbuffer[256];
int wbuffer_len=sizeof(wbuffer);
KeySym keysym=0;
XLookupString(&event.xkey,wbuffer, wbuffer_len, &keysym,NULL);
if (keysym == XK_Escape)
goto endL;
if (keysym == XK_space)
::exit(0);
break;
}
case Expose:
{
if (event.xexpose.count == 0)
XDrawString(xdpy,win,gc,10,40,tmp,tlen);
break;
}
}
if((get_time()-ti)>190000)
break;
}
endL:
XFreeGC(xdpy,gc);
XDestroyWindow(xdpy,win);
XCloseDisplay(xdpy);
return NULL;
}
int main()
{
while(1)
{
int count=NUM_THREADS;
for(int ii=0;ii<count;++ii)
{
pthread_attr_t attr;
pthread_attr_t* attrp=&attr;
pthread_t tid=(pthread_t)-1;
if(pthread_attr_init(attrp)==-1)
attrp=NULL;
else
pthread_attr_setdetachstate(attrp,PTHREAD_CREATE_DETACHED);
pthread_create(&tid,&attr,func,NULL);
}
usleep(250000);
}
return 0;
}
//--------------------------------
|
Страницы: 1 |
|
DmitryShm
Зарегистрирован: 17.11.2003 Сообщения: 211 Откуда: Казань
|
Добавлено: Пн Сен 26 2005 09:00 Заголовок сообщения: никто |
|
|
Никто не пудет рыться в чужом чараканном коде. Задавай конкретный и корректный вопрос или вообще не задавай. Здесь столько всяких словоблудов, что, прочитав твой код, каждый хоть что-то скажет. Сам запутаешься. _________________ love IT |
|