Nieskończona pętla, program działający w tle. Problem z pamięcią.

Nieskończona pętla, program działający w tle. Problem z pamięcią.
N1
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam, mam problem z nieskończoną pętlą.
Mianowicie mój program ma działać non stop.
Sprawdzać czy istnieje plik na dysku, jeśli pojawi się to od razu go otwierać czytać, i to co wyczytał zapisywać w innym pliku na za-mapowanym dysku sieciowym.

Problem tkwi w tym, że aplikacja działa w nieskończonej pętli i po pewnym czasie system wywala ją. Pamięć pochłania także bardzo szybko. Szukałem jakiegoś rozwiązania na Google, ale zanim to znajdę to zestarzeje się :P

Poniżej zamieszczam kod.

Kopiuj
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
                
        public Form1()
        {
            InitializeComponent();

            funkja();
        }


        public void funkja()
        {
            Thread.Sleep(1000);
            Wczytaj();
           
            MessageBox.Show("wyskoczylem");
        }

        public void Wczytaj()
        {
            try
            {
                FileInfo plikor = new FileInfo("D:\\cos.txt");

                if (plikor.Exists == true)
                {
                    string path1 = Path.Combine("D:\\", "cos.txt");
                    FileStream fs = new FileStream(path1, FileMode.Open);
                    StreamReader sr = new StreamReader(fs);

                    string doZmapowany = sr.ReadToEnd();
                    sr.Close();

                    plikor.Delete();

                    MessageBox.Show("W SRODKU");

                    string path2 = Path.Combine("K:\\", "cos.txt");
                    FileStream fw = new FileStream(path2, FileMode.Open);
                    StreamWriter sw = new StreamWriter(fw);

                    sw.WriteLine(doZmapowany);

                    sw.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.ExitThread();
            }
            funkja();
        }
    }

}
KL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 42
0

Przede wszystkim może nie wywołuj funkcji w funkcji. Zamiast tego zapakuj to co potrzebujesz w pętle

Kopiuj
while(true){} 

Poszukaj o zastosowaniu using (){}

Kopiuj
 przy różnego rodzaju streamach. To tak może na początek.
MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
1

a ja widzę po prostu nieskończoną rekurencję: funkja() wywołuje Wczytaj() które wywołuje funkja() .... . Co oczywiście musie się w końcu zakończyć jako "stack overflow".

wedlock
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Bartoszyce
  • Postów: 180
0

Wrzuć pętlę while do StopWatcha i ustaw Event na kilkadziesiąt ms albo do osobnego wątku , bo jak na razie to mrozisz sobie główny wątek UI.

ŁF
  • Rejestracja: dni
  • Ostatnio: dni
0

Przede wszystkim to, co podał Marek, a zaraz potem to, co napisał klemensior o using. Każdy obiekt klasy implementującej interfejs IDisposable powinieneś tworzyć w klauzuli using. Jeśli tego nie robisz, to musisz ręcznie wywołać Dispose() dla każdego takiego obiektu. U Ciebie dotyczy to dwóch streamów i dwóch obiektów operujących na nich.

N1
  • Rejestracja: dni
  • Ostatnio: dni
0

Niestety nie wiem jak wrzucić to do stopWatch ;/

ŁF
  • Rejestracja: dni
  • Ostatnio: dni
0

Bo to nie Stopwatch, a Timer.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.