Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Почему не работает эта программа?

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...