2010-06-29 41 views
5

मैं एक ड्राइंग एप्लिकेशन बना रहा हूं जो ओपनजीएल को प्रस्तुत करता है जब इसे WM_SCROLL या WM_MOUSEMOVE मिलता है। बात यह है कि बहुत सारे माउस चाल हैं और मुझे प्रति सेकंड अधिकतम 60 फ्रेम प्रस्तुत करने की आवश्यकता है। इसलिए मैंने कैनरेन्डर नामक अपने इंजन वर्ग में एक बूल बनाया। तो मेरे प्रस्तुत करने में() proc मैं करता हूं: अगर (! कैनेंडर) { वापसी; } कैनेंडर = झूठा;मेरा टाइमर टिकिंग क्यों बंद कर देता है?

असल में यह 60 से अधिक एफपीएस प्रस्तुत करने से रोकता है।

मैं WM_CREATE में टाइमर बना देता हूं।

जब मुझे WM_TIMER मिलता है तो मैं कन्डरडर को सत्य पर सेट करता हूं।

मैंने इसे बीप बनाया ताकि मुझे पता चले कि टाइमर चल रहा है। जैसे ही मैं स्क्रॉलिंग या माउस को ले जाना शुरू करता हूं, बीपिंग बंद हो जाती है और अब मैं प्रतिपादन नहीं देख पाता हूं। यह मेरे टाइमर को क्यों रोक देगा? इसके अलावा जब मैं टाइमर को फिर से शुरू करता हूं तो फिर से शुरू होता है, फिर से इसे फिर से बंद कर देता है।

धन्यवाद

संदेश पम्प:

// Main message loop: 
while (GetMessage(&msg, NULL, 0, 0)) 
{ 
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

} 

return (int) msg.wParam; 

निर्माण:

case WM_CREATE: 
    //Set Window Title 
    SetWindowText(hWnd,engineGL.current.caption.c_str()); 

    SetTimer(hWnd,    // handle to main window 
     120,     // timer identifier 
     17,      // 60 fps interval 
     (TIMERPROC) NULL);  // no timer callback 
+2

आपका पूरा संदेश पंप कैसा दिखता है, और क्या आप टाइमर बनाने के लिए उपयोग किए गए कोड को भी पोस्ट कर सकते हैं? –

+0

हां, मुझे संदेह है कि आपके ईवेंट प्रसंस्करण के साथ कुछ अजीब बात है। – stinky472

+0

यह केवल तभी होता है जब मेरा रेंडर फ़ंक्शन कैनरेंडर को झूठा सेट करता है, अन्यथा यह ठीक – jmasterx

उत्तर

3

ऐसा क्यों है इतनी जटिल बना रही है?

विंडोज़ एप्लिकेशन में ड्राइंग आमतौर पर केवल WM_PAINT संदेश में किया जाता है और RedrawWindow फ़ंक्शन द्वारा ट्रिगर किया जाता है। आप RedMWindow को WM_SCROLL और WM_MOUSEMOVE के भीतर कॉल कर सकते हैं। यदि आपका एप्लिकेशन ड्राइंग के साथ नहीं रह सकता है तो RedrawWindow (WM_PAINT संदेशों) को एकाधिक कॉल ध्वस्त कर दिए जाएंगे।

यदि आप ओपनजीएल को अपने मॉनीटर वर्टिकल रिट्रेस के साथ सिंक्रनाइज़ करने के लिए सेट करते हैं तो आप कुछ रीफ्रेश दर से अधिक नहीं होंगे।


अपने प्रश्न का के रूप में ... मुझे लगता है कि कई WM_SCROLL और WM_MOUSEMOVE संदेशों वहाँ रहे हैं। और उनको ध्वस्त नहीं किया जा सकता है। तो यदि आप उनके अंदर अपना चित्रण करते हैं (जिसमें समय लगता है), तो आप अपना संदेश कतार ब्लॉक करते हैं और WM_TIMER संदेशों को प्रबंधित नहीं किया जा सकता है। इस प्रकार, आप बीप नहीं सुनते हैं।

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