2013-07-04 8 views
8

में विंडोज़ को लटकने का क्या कारण है, हमें एक बड़े और जटिल डेस्कटॉप एप्लिकेशन के साथ कुछ समस्याएं आई हैं, जहां डब्ल्यूपीएफ के लिए माइक्रोसॉफ्ट रिबन का उपयोग (या इससे जुड़े चीजों का संयोजन) कंप्यूटर को कंप्यूटर का कारण बनता है लटका।इस डब्ल्यूपीएफ रिबन एप्लिकेशन

नीचे उबला हुआ नीचे कोड कई कंप्यूटरों पर विंडोज़ लटका स्थिति को ट्रिगर करने लगता है। कुछ कंप्यूटर हर बार इस लटका अनुभव करेंगे, कुछ इसे कभी अनुभव नहीं करेंगे। लटका होगा, कुछ कंप्यूटर पर पूरे सत्र को लॉक कर देगा (num लॉक और कैप्स लॉक समेत), लेकिन दूसरों पर, माउस अभी भी स्थानांतरित होगा (अभी भी व्यवसाय से बाहर संख्या लॉक)। जब कंप्यूटर अनुत्तरदायी हो जाता है, ऐसा लगता है कि रिमोट लॉगऑन और नेटवर्क शेयरिंग जैसी चीजें अभी भी काम करती हैं, लेकिन कंसोल सत्र को समाप्त करना संभव नहीं है।

  • माइक्रोसॉफ्ट रिबन WPF
  • विंडोज एक ElementHost
  • में आवेदन की मेजबानी WPF नियंत्रण फॉर्म्स के लिए:

    संक्षेप में, जो होने के लिए व्यवहार का मूल कारण कुछ चीजें का संयोजन है लगता है

  • सॉफ्टवेयर के उपयोग WPF रिबन पर प्रतिपादन (CreateParams के उपयोग के द्वारा) डबल बफ़र विण्डोज़ फॉर्म्स के उपयोग

हमने बाद में कुछ चयनित रूपों पर WS_EX_COMPOSITED का उपयोग करके इस समस्या को हल किया है, लेकिन मैं इस मुद्दे के मूल कारण को उजागर करना चाहता हूं।

मुझे अभी तक लटकने के लिए एक सीधा आगे बढ़ने का तरीका नहीं मिला है, लेकिन कम से कम कुछ मशीनों पर, कम से कम कुछ मशीनों पर, व्यवसाय को पूरा करने/पुनर्स्थापित करने और माउस के ऊपर माउस को घुमाने के द्वारा व्यवसाय किया जाता है रिबन बटन।

निम्नलिखित कोड x86 .NET 4.0 के रूप में संकलित किया गया है, Microsoft WPF Ribbon .NET 4.0 लाइब्रेरी के विरुद्ध।

using System; 
using System.Windows.Forms; 
using Microsoft.Windows.Controls.Ribbon; 
using System.Windows.Interop; 
using System.Windows.Forms.Integration; 

namespace WindowsRibbonHang 
{ 
    public class Form1 : Form 
    { 
     protected override CreateParams CreateParams 
     { 
      get 
      { 
       CreateParams cp = base.CreateParams; 
       cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED 
       return cp; 
      } 
     } 

     public Form1() 
     { 
      Ribbon ribbon = new Ribbon(); 

      RibbonTab tab = new RibbonTab { Header = "FooTab" }; 
      ribbon.Items.Add(tab); 

      RibbonSplitButton button = new RibbonSplitButton { Label = "FooButton" }; 
      tab.Items.Add(button); 

      ElementHost elementHost = new ElementHost 
      { 
       Dock = DockStyle.Fill, 
       Child = ribbon, 
      }; 

      Controls.Add(elementHost); 
      Dock = DockStyle.Fill; 

      ribbon.Loaded += (sender, args) => { 
       HwndSource hwndSource = System.Windows.PresentationSource.FromVisual(ribbon) as HwndSource; 
       HwndTarget hwndTarget = hwndSource.CompositionTarget; 
       hwndTarget.RenderMode = RenderMode.SoftwareOnly; 
      }; 
     } 
    } 

    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 
     } 
    } 
} 
+0

क्या आपने कभी इस मुद्दे को हल किया है? मुझे केवल यह प्रश्न मिल सकता है और यह अन्य एक http://stackoverflow.com/questions/7719627/wpf-elementhost-in-winforms-crashes-windows-when- इस मुद्दे पर मिश्रित है लेकिन न ही कोई समाधान मिला है। –

+0

@EduardoWada वास्तव में नहीं। जैसा कि @ ओली ने कहा, शायद इसे ग्राफिक्स ड्राइवरों के साथ डब्ल्यूपीएफ इंटरैक्ट करने के तरीके से करना होगा। "समाधान" 'CreateParams' ओवरराइड को अक्षम करना था, और इसके बजाय अधिक लक्षित रूपों पर ऐसा करना था। – torkildr

उत्तर

1

जांचने का प्रयास करें कि प्रभावित कंप्यूटर पर ग्राफिक्स ड्राइवर अद्यतित हैं। डब्ल्यूपीएफ पारंपरिक जीडीआई कोड से बहुत अलग काम करता है, इसलिए कभी-कभी अविश्वसनीय ड्राइवर आपके द्वारा वर्णित समस्या का कारण बन सकते हैं।

+0

मैं यह भी सोच रहा हूं कि यह ग्राफिक्स ड्राइवर से संबंधित हो सकता है।नोट करना दिलचस्प है कि ऐसा लगता है कि कई ग्राफिक्स कार्ड विक्रेताओं में ऐसा लगता है। जैसा कि आपने सुझाव दिया है, मैंने भी नवीनतम ग्राफिक्स ड्राइवर को अपडेट करने का प्रयास किया है। – torkildr

1

जैसा कि आपको पता चला है कि समस्या समग्र विंडोज के साथ आता है। मैं इस मुद्दे को आगे विश्लेषण किया है और यह एक ओएस संबंधित समस्या हो रहा है:

देखें The Case of Slow WPF Rendering in a WinForms Application

दो धागे प्रस्तुत करना और एक पाश में एक दूसरे को खिड़की अमान्य जहां एक धागे पर समग्र Winforms विंडो renders और पर करने की कोशिश अन्य थ्रेड डब्ल्यूपीएफ थ्रेड प्रस्तुत करता है वही काम करता है। यह Win 7 - Win 10 मशीनों पर तब तक होता है जब तक सॉफ्टवेयर प्रतिपादन सक्रिय न हो।

यह एक डीडब्लूएम (डेस्कटॉप विंडो प्रबंधक) मुद्दा जैसा दिखता है जहां केवल एमएस विशेषज्ञ हमें बता सकते हैं कि क्या डब्ल्यूपीएफ या विनफॉर्म एक अंतर्निहित अनुबंध का उल्लंघन कर रहे हैं या यदि यह एक सादा डीडब्लूएम बग है।

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