2008-12-05 9 views
5

में PrintDialog और PrintPreviewDialog का उपयोग करते समय लॉक हो रहा है। मैं .NET के प्रिंटप्रूव्यूडियल का उपयोग कर रहा हूं और जब भी यह पूर्वावलोकन उत्पन्न कर रहा है, तो यह पृष्ठभूमि में मेरे जीयूआई को लॉक करता है और ऐसा लगता है कि पूर्वावलोकन समाप्त होने तक यह क्रैश हो गया है। यह देखकर कि .NET की पृष्ठ प्रगति विंडो जो पॉप अप करती है वह एक संवाद नहीं है, बैक ग्राउंड का चयन किया जा सकता है जो तब आधे खींचे गए, लॉक अप तरीके से सामने आता है। यह तब भी होता है जब उपयोगकर्ता पूर्वावलोकन संवाद पर वास्तविक "प्रिंट" बटन पर क्लिक करता है, और जब मैं केवल PrintDocument.Print() चलाता हूं।जीयूआई .net

//just showing a preview, hangs up background GUI on generating the preview 
// and when user prints straight from the preview 
this.printPreviewDialog.ShowDialog(this); 

//just trying to print a .net PrintDocument class, GUI hangs in background 
// when .net is drawing the pages 
this.printDocument.Print(); 
+0

ऐसा लगता है कि दस्तावेज़ उत्पन्न करने के लिए आपके कोड में एक प्रदर्शन समस्या है। – GvS

उत्तर

1

आप शायद एक अलग सूत्र में उन तरीकों बुलाना चाहिए अगर वे ले: वहाँ एक आसान तरीका उपयोगकर्ता प्रिंट पृष्ठों आकर्षित करने के लिए .net के लिए इंतज़ार कर रहा है जब फांसी से जीयूआई को रोकने के लिए निम्नलिखित कोड को संशोधित करने के लिए है बहुत लंबा। आपकी सहायता के लिए BackgroundWorker के उपयोग की जांच करें।

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

+0

हाँ, मैं ऐसा करने के तरीके के बारे में सोचने की कोशिश कर रहा हूं, लेकिन आप इसे नहीं चला सकते हैं। प्रिंटर पूर्वावलोकन देखें। ShowDialog (यह); एक अलग थ्रेड पर, चूंकि आपको जीयूआई घटकों तक पहुंचने का प्रयास करने के लिए एक क्रॉस थ्रेड अपवाद प्राप्त होगा। – EMaddox84

+0

क्या आप जानते हैं कि यह इतना लंबा क्यों ले रहा है, क्या कोई ऐसी विधि है जिसे आप कॉल कर रहे हैं जो उस समय के लिए उत्तरदायी है और इसे किसी अन्य धागे पर ले जाया जा सकता है? – gcores

+0

आपको यह सुनिश्चित करने की ज़रूरत है।printPreviewDialog को पृष्ठभूमि थ्रेड में बनाया गया है, न केवल किसी अन्य थ्रेड से ShowDialog को कॉल करना – grepsedawk

1

शोडियलॉग विधि एक मोडल विंडो बनाता है, यह मुख्य धागे को अवरुद्ध करता है। शो विधि एक गैर-मॉडल विंडो बनाता है, यह मुख्य धागे को अवरुद्ध नहीं करता है।

जब आप

this.printDocument.Print() कहते हैं;

यह फिर से मुख्य धागे में अपना काम करता है।

ऐसा करने के लिए है कि एक पृष्ठभूमि सूत्र में, आप की तरह कुछ (मेरे सिर के ऊपर से) की कोशिश कर सकते

ThreadPool.QueueUserWorkItem ((obj) => this.printDocument.Print());

यह मुख्य जीयूआई थ्रेड के बजाय दस्तावेज़ मुद्रित करने के लिए एक नया धागा का उपयोग करता है।

ThreadStart ts =() => 
{ 
    printDocument.Print(); 

    // Start the message loop to prevent the thread from finishing straight away. 
    System.Windows.Forms.Application.Run(); 
}; 
Thread t = new Thread(ts); 
t.SetApartmentState(ApartmentState.STA); 
t.Start(); 

ध्यान रखें कि यह कोड का परीक्षण नहीं किया जाता है और आवश्यकता हो सकती है:

आप अधिक जानना चाहते हैं, तो आप

3

सूत्रण एक अन्य विकल्प के लिए एक नया यूआई धागा ऊपर कताई किया जाएगा अनुसंधान करने के लिए है कुछ ट्यूनिंग (विशेष रूप से संदेश पाश भाग) - और आप यह भी ध्यान में रखना चाहेंगे कि आपको कुछ समय में धागे को बंद करने की आवश्यकता होगी - तो हो सकता है कि आप कक्षा को बातचीत और आजीवन प्रबंधन को संभालने के लिए चाहें।

+1

मैंने पहले कभी नहीं देखा है। इसके बजाय ThreadPool का उपयोग क्यों नहीं करें? – foson

+0

मेरे लिए अच्छी तरह से काम करता है। प्रिंटिंग करते समय मुझे मुख्य विंडो में कुछ ताज़ा करने की ज़रूरत थी :) –

+0

WPF के लिए उदाहरण: https://stackoverflow.com/questions/7335507/printing-the-content-of-a-documentviewer-in-a- अलग-ui -thread –

0

डॉट नेट रॉक्स टीवी (dnrtv) GUI थ्रेड को episode 16 में मुक्त रखने के लिए पृष्ठभूमि थ्रेड में चीजों को चलाने के तरीके को कवर करता है।

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