problem z wątkami (odczyt i zapis do jednego pliku)

0

Hej wszystkim.

Mam sobie aplikację, która coś tam robi. Generalnie jej zadanie to analiza i rysowanie wykresu na podstawie danych pobranych z pliku excel. Analizę taką można prowadzić nazwijmy to kilkutorowo (dokładnie 10 analiz jednocześnie) dlatego też każdą z nich obsługuje inny wątek. Każda z analiz jest prowadzona w osobnej zakładce tabPage kontrolki tabControl.Wszystko się ładnie liczy, rysuje itd. do momentu w którym pojawiają się trzy problemy:

  1. Nie mogę odczytywać danych z jednego pliku do kilku analiz. Jeżeli jednego pliku użyję do jednej analizy to potem w drugiej tabPage, jeżeli chce z niej skorzystać to mi wywala błąd, że wybrany plik jest w użyciu. Do odczytywania danych z pliku excel korzystam z oleDBConnection. Jak zrobić aby coś takiego było możliwe.

  2. To samo się tyczy zapisu do pliku (dziennik logów). Ja zmusić program aby zapisywał zdarzenia z róznych wątków do jednego pliku.

  3. W momencie wykonywania się analizy gdy chce zamknąć całą aplikację wyskakuje mi okienko z komunikatem: "Trwało przerywanie wątku". Nie wiem skąd to się bierze. Obsługę zdarzenia zamknięcia aplikacji mam zakodowaną w funkcji:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
foreach (TabPage tp in tabControl1.TabPages)
{
foreach (Control ctrl in tp.Controls)
{
if (ctrl.GetType().Equals(typeof(UserControl1)) && tp == tabControl1.SelectedTab)
{
UserControl1 us = ctrl as UserControl1;
try
{
if (us.checkStartAnaliseButton == true)
{
us.newThread.Abort();
}
}
catch(ThreadAbortException)
{
throw;
}
}
}
}
}  

Nie wiem co jest nie tak.

Proszę pomóżcie mi bo już ślęczę nad tym dwa dni i nici.
Z góry dzięki za każdą pomoc Smile

0
  1. File.Open żąda prawa dostępu do pliku na wyłączność!!!
  2. Wielowątkowe zapisywanie do pliku jest klasą problemu: Producent i Konsument. U ciebie powinno występować kilku Producentów (wątków produkujących wyniki) i jeden wątek Konsumenta (zapisujący do pliku). Powinieneś zrobić jedną klasę Konsument, która będzie otwierała plik i zapisywała, a te klasy, które produkują u ciebie wyniki Producenci przerób tak by zapisywały do wątku Konsument. Producennci podają dane do Konsumenta. Aby nie było problemów musisz zapewnić, że Konsument nie będzie mógł pobrać danej, której Producenci nie wyprodukowali i żeby kilku Producenctów na raz nie mogło wstawić danej do Konsumenta.

Przykład w javie(niestety nie mam w c#):

class Producent extends Thread 
{
	private Pudelko pudelko;
 	private int m_nLiczba;
 	public Producent(Pudelko c, int liczba) 
	{
  		pudelko = c;
  		this.m_nLiczba = liczba;
	}
	public void run() 
	{
		for (int i = 0; i < 10; i++) 
		{
			pudelko.wloz(i);
			System.out.println("Producent #" + this.m_nLiczba + " wlozyl: " + i);
			try 
			{
				sleep((int)(Math.random() * 100));
			} 
			catch (InterruptedException e) {  }
		}
	}
}

class Konsument extends Thread 
{
	private Pudelko pudelko;
	private int m_nLiczba;
	public Konsument(Pudelko c, int Liczba) 
	{
		pudelko = c;
		this.m_nLiczba = Liczba;
	}
	public void run() 
	{
     		int wartosc = 0;
    	 	for (int i = 0; i < 10; i++) 
		{
			wartosc = pudelko.wez();
       			System.out.println("Konsument #" + this.m_nLiczba + " wyjal: " + wartosc);
    		}
	}
}

class Pudelko 
{
	private int m_nZawartosc;   // to jest znienna warunkowa
	// do której dostęp synchronizujemy, (omówione później)
	private boolean m_bDostepne = false;
	public synchronized int wez() 
	{
		while (m_bDostepne == false) 
		{
			try 
			{	wait(); } 
			catch (InterruptedException e) { }
		}
		m_bDostepne = false;
		notifyAll();
		return m_nZawartosc;
	}
	public synchronized void wloz(int wartosc) 
	{
		while (m_bDostepne == true) 
		{
			try 
			{ wait();	} 
			catch (InterruptedException e) { }
		}
		m_nZawartosc = wartosc;
		m_bDostepne = true;
		notifyAll();
	}
}

class ProdKonsTest 
{
	public static void main(String[] args) throws Exception
	{
		Pudelko c = new Pudelko();
		Producent p1 = new Producent(c, 1);
		Konsument c1 = new Konsument(c, 1);
		p1.start();
		c1.start();
		pauza(); 
	}
	static void pauza() throws java.io.IOException
	{
		System.out.println("Nacisnij Enter...");
		System.in.read();
	}
}

Testy
Nacisnij Enter...
Producent #1 wlozyl: 0
Konsument #1 wyjal: 0
Konsument #1 wyjal: 1
Producent #1 wlozyl: 1
Producent #1 wlozyl: 2
Konsument #1 wyjal: 2
Konsument #1 wyjal: 3
Producent #1 wlozyl: 3
Konsument #1 wyjal: 4
Producent #1 wlozyl: 4
Producent #1 wlozyl: 5
Konsument #1 wyjal: 5
Konsument #1 wyjal: 6
Producent #1 wlozyl: 6
 
  1. Poczytaj o blokowaniu dostępu do obiektu za pomocą lock.
  2. Istnieje jeszcze coś takiego jak programowanie asynchroniczne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1