2009-09-11 27 views
5

मैं कई महत्वपूर्ण प्रेस ईवेंट अनुकरण करना चाहता हूं। मुझे XTestFakeKeyEvent का उपयोग करके एक समाधान मिला, लेकिन जब मैं 210 से अधिक बार अनुकरण करता हूं तो मेरा प्रोग्राम "सेगमेंट की अधिकतम संख्या" सेगमेंटेशन गलती उठाता है। मुझे नहीं पता कि इस समस्या को कैसे हल किया जाए।सहायता: अधिकतम ग्राहकों की संख्या - सेगमेंटेशन गलती

मेरे यहाँ कोड:

#include <X11/Xlib.h> 
#include <X11/keysym.h> 
#include <X11/extensions/XTest.h> 
#include <stdio.h> 

#define PRESS_UP 0 
#define PRESS_DOWN 1 
#define PRESS_LEFT 2 
#define PRESS_RIGHT 3 
#define PRESS_ENTER 4 
#define PRESS_ESC 5 
#define PRESS_HOME 6 

Display *display; 
unsigned int keycode; 

int press(int key){ 
    display = XOpenDisplay(NULL); 

    if(key == PRESS_UP) 
     keycode = XKeysymToKeycode(display, XK_Up); 
    else if(key == PRESS_DOWN) 
     keycode = XKeysymToKeycode(display, XK_Down); 
    else if(key == PRESS_LEFT) 
     keycode = XKeysymToKeycode(display, XK_Left); 
    else if(key == PRESS_RIGHT) 
     keycode = XKeysymToKeycode(display, XK_Right); 
    else if(key == PRESS_ENTER) 
     keycode = XKeysymToKeycode(display, XK_Return); 
    else if(key == PRESS_ESC) 
     keycode = XKeysymToKeycode(display, XK_Escape); 
    else if(key == PRESS_HOME) 
     keycode = XKeysymToKeycode(display, XK_Home); 

    XTestFakeKeyEvent(display, keycode, True, 0); 
    XTestFakeKeyEvent(display, keycode, False, 0); 
    XFlush(display); 
    return 0; 
} 

int main(int argc, char *argv[]){ 
    int count = 0; 
    while (count < 500){ 
     press(PRESS_UP); 
     printf("count =%d\n" ,count); 
     count ++; 
    } 
} 

आउटपुट:

$ gcc -lXtst -lX11 Util_KeyPressSimulator.c 
$ ./a.out 
count =0 
^[[Acount =1 
^[[Acount =2 
... 
^[[Acount =208 
^[[Acount =209 
^[[Acount =210 
^[[AMaximum number of clients reachedSegmentation fault 

एक मदद कृपया है, धन्यवाद।

उत्तर

12

आप XCloseDisplay मिलान किए बिना प्रति पुनरावृत्ति XOpenDisplay कर रहे हैं। एक बार प्रदर्शन को खोलने पर विचार करें, main() में, लूप के बाहर, और बाहर निकलने से पहले इसे बंद करें।

+2

असफल 'XOpenDisplay' के लिए भी कोई जांच नहीं है, इसलिए यदि यह विफल हो जाता है तो यह क्लाइंट क्रैश हो जाता है। – mark4o

संबंधित मुद्दे