Beispiel #1
0
        private void rilasciaRisorsePaginaPrecendete(int pageNumber)
        {
            // Sulla prima pagina non ho ancora nulla da fare
            if (pageNumber == 0)
            {
                return;
            }

            // Libero un pò di memoria, ammesso di fare ancora in tempo.
            foreach (IImmagine immagine in immaginiPaginaPrecedente)
            {
                immagine.Dispose();
            }
            immaginiPaginaPrecedente.Clear();

            if (lastLoadedPage != null)
            {
                lastLoadedPage.Dispose();
                lastLoadedPage = null;
            }

            // Qualche cabala + incantesimi
            FormuleMagiche.rilasciaMemoria();
            // Dopo il passaggio a .net 4.6 e sqlite aggiornato, questo non funziona più e si pianta
            //			FormuleMagiche.attendiGcFinalizers();
            //			FormuleMagiche.rilasciaMemoria();
        }
        private void Provinatore_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            _cronoFine = DateTime.Now;

            FormuleMagiche.rilasciaMemoria();

            var tempo = _cronoFine - _cronoInizio;

            _giornale.Debug("Crono = " + tempo.TotalSeconds);
        }
        /// <summary>
        //  azzero la gallery corrente e rilascio la memoria eventualmente utilizzata dalle foto
        /// </summary>
        private void svuotaGalleryCorrente()
        {
            if (fotografie != null)
            {
                foreach (Fotografia f in fotografie)
                {
                    AiutanteFoto.disposeImmagini(f, IdrataTarget.Tutte);
                }

                FormuleMagiche.rilasciaMemoria();
            }
            fotografie = null;
        }
        public void chiusoSnapshotPubblicoWindow(object sender, EventArgs e)
        {
            _snapshotPubblicoWindow.Closed -= chiusoSnapshotPubblicoWindow;
            _snapshotPubblicoWindow         = null;

            // Se ho aperto lo ss, lo riporto in primo piano.
            if (_slideShowWindow != null)
            {
                _slideShowWindow.Topmost = true;
            }

            FormuleMagiche.attendiGcFinalizers();
        }
Beispiel #5
0
        public void Execute(object parameter)
        {
            try {
                _giornale.Debug("Eseguo RelayCommad: " + _execute.Method.ToString() + " parametro=" + parameter);

                esegui(parameter);

                if (_afterExecute != null)
                {
                    _giornale.Debug("RelayCommad invoco after execute");

                    _afterExecute.Invoke(parameter);
                }

                _giornale.Debug("Esecuzione RelayCommad completata: " + _execute.Method.ToString() + " parametro=" + parameter);
            } catch (OutOfMemoryException ofm) {
                long memoryPrima = Process.GetCurrentProcess().WorkingSet64;

                FormuleMagiche.attendiGcFinalizers();

                long memoryDopo = Process.GetCurrentProcess().WorkingSet64;

                _giornale.Error("finita la memoria: prima=" + memoryPrima + " dopo=" + memoryDopo);

                if (_execute.Target is ViewModelBase)
                {
                    ViewModelBase viewModel = _execute.Target as ViewModelBase;
                    if (viewModel.dialogProvider != null)
                    {
                        viewModel.dialogProvider.ShowError(ofm.GetType().Name + "\n" + ErroriUtil.estraiMessage(ofm), "Errore imprevisto.", null);
                    }
                }
            } catch (Exception ee) {
                _giornale.Error(_execute.Method.ToString(), ee);

                if (_execute.Target is ViewModelBase)
                {
                    ViewModelBase viewModel = _execute.Target as ViewModelBase;
                    if (viewModel.dialogProvider != null)
                    {
                        viewModel.dialogProvider.ShowError(ee.GetType().Name + "\n" + ErroriUtil.estraiMessage(ee), "Errore imprevisto. Consultare il Log", null);
                    }
                }

                // per ora non voglio far spaccare il programma altrimenti perdo il lavoro in corso.
                // anche se concettualmente sarebbe più corretto rilanciare l'errore.
                // L'unico problema è che non c'è modo di fare un try-catch di un Command.
                // throw ee;
            }
        }
        public void chiusoPubblicoWindow(object sender, EventArgs e)
        {
            if (_pubblicoWindow != null)
            {
                _pubblicoWindow.Closed -= chiusoPubblicoWindow;
                _pubblicoWindow         = null;
            }
            if (!azioneInCorso)
            {
                stavaGirandoPubblico = false;
            }

            FormuleMagiche.attendiGcFinalizers();
        }
Beispiel #7
0
        public void outOfMemoryImmagini()
        {
            const int quante       = 1000;
            const int ogniTotPurga = 100;

            List <Fotografia> ff = cercaFotoQuasiasi(5);

            // Ricavo la memoria libera prima del test
            long memoryPrima = Process.GetCurrentProcess().WorkingSet64;

            for (int ii = 0; ii < quante; ii++)
            {
                foreach (Fotografia f in ff)
                {
                    AiutanteFoto.idrataImmaginiFoto(f, IdrataTarget.Tutte);

                    AiutanteFoto.disposeImmagini(f, IdrataTarget.Tutte);

                    // ogni tot iterazioni, vado a liberare la memoria che inspiegabilmente non viene pulita.
                    if ((ii % ogniTotPurga) == 0)
                    {
                        // ATTENZIONE: IMPORTANTE.
                        // Se non metto questa formula magica,
                        // il GC non pulisce la memoria occupata dalla bitmap (inspiegabilmente)
                        FormuleMagiche.rilasciaMemoria();
                    }

                    long memoryDurante = Process.GetCurrentProcess().WorkingSet64;
                    long consumata     = (memoryDurante - memoryPrima);

                    // Se supero il massimo impostato, probabilmente il gc non sta pulendo.
                    if (consumata > maxMem)
                    {
                        Assert.Fail("Probabilmente si sta consumando troppa memoria: diff(MB)=" + consumata / 1024);
                    }
                }
            }
        }
Beispiel #8
0
        public void outOfMemoryStampa()
        {
            long memoryPrima = Process.GetCurrentProcess().WorkingSet64;

            string[] nomiFilesImmagine = Costanti.NomiFileImmagini;

            // 10 foto x 50 giri = 500 foto
            foreach (string nomeFileImmagine in nomiFilesImmagine)
            {
                for (int giri = 1; giri <= 50; giri++)
                {
                    using (PrintServer ps1 = new PrintServer()) {
                        using (PrintQueue coda = ps1.GetPrintQueue(Costanti.NomeStampante)) {
                            PrintDialog dialog = new PrintDialog();
                            dialog.PrintQueue = coda;

                            Size areaStampabile = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight);
                            // Ora creo il documento che andrò a stampare.
                            // L'uso di un FixedDocument, mi permetterà di interagire con misure, dimensioni e margini
                            FixedDocument document = new FixedDocument();
                            document.DocumentPaginator.PageSize = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight);

                            // Creo una pagina della grandezza massima
                            FixedPage page1 = new FixedPage();
                            page1.Width               = document.DocumentPaginator.PageSize.Width;
                            page1.Height              = document.DocumentPaginator.PageSize.Height;
                            page1.VerticalAlignment   = VerticalAlignment.Center;
                            page1.HorizontalAlignment = HorizontalAlignment.Center;


                            // Per fare in modo che l'immagine venga centrata bene automaticamente, e non venga tagliata solo da una parte ma nel centro,
                            // non devo mettere le dimensioni al componente Image, ma devo creare
                            // una Grid più esterna con le dimensioni precise.
                            Grid grid = new Grid();
                            grid.Height = page1.Height;
                            grid.Width  = page1.Width;


                            // Creo una immagine che contiene la bitmap da stampare
                            Image image = new Image();
                            image.VerticalAlignment   = VerticalAlignment.Center;
                            image.HorizontalAlignment = HorizontalAlignment.Center;

                            // E' importante fare la dispose dell'oggetto Immagine
                            using (ImmagineWic qq = new ImmagineWic(nomeFileImmagine)) {
                                image.Source = qq.bitmapSource;

                                image.Stretch          = Stretch.UniformToFill;
                                image.StretchDirection = StretchDirection.Both;
                                grid.Children.Add(image);
                                page1.Children.Add(grid);


                                // add the page to the document
                                PageContent page1Content = new PageContent();
                                page1Content.Child = page1;
                                document.Pages.Add(page1Content);

                                //
                                // ----- STAMPA per davvero
                                //
                                dialog.PrintDocument(document.DocumentPaginator, "test" + giri.ToString());

                                foreach (var fixedPage in document.Pages.Select(pageContent => pageContent.Child))
                                {
                                    fixedPage.Children.Clear();
                                }
                            }

                            // ATTENZIONE: IMPORTANTE.
                            // Se non metto questa formula magica,
                            // il GC non pulisce la memoria occupata dalla bitmap (inspiegabilmente)
                            FormuleMagiche.rilasciaMemoria();
                        }
                    }

                    long memoryDopo = Process.GetCurrentProcess().WorkingSet64;
                    long consumata  = (memoryDopo - memoryPrima);

                    // Se supero il massimo impostato, probabilmente il gc non sta pulendo.
                    if (consumata > maxMem)
                    {
                        Assert.Fail("Probabilmente si sta consumando troppa memoria: diff(MB)=" + consumata / 1024);
                    }
                }
            }
        }