2009-03-24 16 views
10

पकड़ने मैं एक ओपन आवेदन के लिए SDL उपयोग कर रहा हूँ से एसडीएल रोकूँ, लिनक्स पर चल रहा। मेरी समस्या यह है कि एसडीएल सिगिनट पकड़ रहा है और इसे अनदेखा कर रहा है। यह एक दर्द है क्योंकि मैं एक स्क्रीन सत्र के माध्यम से विकास कर रहा हूं, और मैं CTRL-C के साथ चल रहे प्रोग्राम को मार नहीं सकता (जिस प्रोग्राम पर कंप्यूटर चल रहा है वह प्रोजेक्टर से जुड़ा हुआ है और इसमें कोई इनपुट डिवाइस नहीं है)।एसडीएल/C++ ओपन कार्यक्रम, मैं कैसे SIGINT

क्या कोई झंडा या कुछ मैं एसडीएल को पास कर सकता हूं ताकि वह सिगिनट को कैप्चर न करे? मैं वास्तव में प्रोग्राम को सिग्नल प्राप्त करने पर रोकना चाहता हूं (यानी जब मैं ctrl-c दबाता हूं)।

उत्तर

11

कंसोल पर Ctrl-C एक SDL_QUIT घटना उत्पन्न करता है। आप एसडीएल_PollEvent या SDL_WaitEvent का उपयोग करके इस घटना के लिए देख सकते हैं, और जब पता चला है तो बाहर निकलें (साफ-सफाई)।

ध्यान दें कि अन्य कार्यों एक SDL_QUIT घटना उत्पन्न कर सकते हैं (उदाहरण के लिए विंडो प्रबंधक के माध्यम से अपने मुख्य विंडो को बंद करने का प्रयास)।

3

SDL_INIT_NOPARACHUTE initialisation झंडा पासिंग SDL_Init करने के लिए "घातक संकेत पकड़ने से एसडीएल रोकता है"।


देखें: http://www.libsdl.org/cgi/docwiki.cgi/SDL_Init

+0

NOPARACHUTE झंडा प्रतीत नहीं होता SIGINT, केवल विभाजन दोष की तरह घातक समस्याओं, आदि – MichaelM

5

मैं एक जवाब मिल गया है:

SDL_INIT_NOPARACHUTE झंडा घातक संकेत पर कब्जा ताकि एसडीएल खुद के बाद साफ कर सकते हैं होगा। यह एसआईजीएसईजीवी जैसी चीजों के लिए काम करता है, लेकिन स्पष्ट रूप से सिगिनट पर्याप्त घातक नहीं है।

मेरे समाधान के बाद एसडीएल initialised कर दिया गया है SIGINT के संकेत हैंडलर रीसेट करने के लिए है:

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE); 
signal(SIGINT, SIG_DFL); 

धन्यवाद कैश आप इनपुट के लिए, यह मेरे सही रास्ते पर डाल दिया।

माइकल

+1

को पकड़ने के लिए:

बस मेरे विंडोज़ अनुप्रयोग पर परीक्षण किया, अब मैं सभी संकेत ठीक से फिर से, का उपयोग कर प्राप्त कर सकते हैं स्टीव एस के उल्लेख के रूप में इस समस्या को हल करने का सही तरीका एसडीएल_QUIT घटनाओं को सुनकर होगा। – Grumbel

1

आप वास्तव में किसी कारण से एक घटना पाश उपयोग नहीं कर रहे हैं, तो आप अपने "चुनाव सामग्री" पाश में SDL_QuitRequested उपयोग कर सकते हैं।

1

SDL_quit.c में, संकेतों के लिए एक जांच है कि सिग्नल हैंडलर का उपयोग SDL_QuitInit() में नहीं किया जाना चाहिए। यह सुनिश्चित नहीं है कि मूल प्रश्न पूछे जाने पर पुराने संस्करणों में यह अस्तित्व में था, लेकिन यहां आने वाले लोगों के लिए आसान हो सकता है।

SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1"); 
SDL_Init(...); 
संबंधित मुद्दे