Cześć.
Mam następujący problem. Kończę aplikację, która coś tam sobie robi. Równolegle pewien kod (odpowiadający za rysowanie wykresów i zapis do logu) może być wykonywany przez max. 10 wątków. Nie potrafię sobie poradzić z zsynchronizowaniem zapisu przez te wątki zdarzeń do dziennika logów. Wywala mi exception - że plik jest już używany przez inny proces.
Z poziomu pliku form1.cs startuję wątki, które wykonują funkcję zawarte w innym pliku charts.cs. Wywołanie następuje poprzez kliknięcie na button i zrealizowanie kodu:
UserControl1 us = ctrl as UserControl1;
us.newThread = new Thread(new ThreadStart(us.wykres.CreateChart));
us.newThread.Start();
Plik charts.cs:
public class Charts
{
private StreamWriter sw = new StreamWriter("logFile.txt", true);
private ZedGraphControl zzz;
public ZedGraphControl ZZZ
{
get { return zzz; }
set { zzz = value; }
}
private UserControl1 uc1;
public UserControl1 Uc1
{
get { return uc1; }
set { uc1 = value; }
}
//jakiś kod
public void CreateChart()
{
try
{
//tutaj znów jakiś kod
//poniżej najważniejsza
while ()
{
if ()
{
if (go == false)
{
ZZZ.Invoke(Uc1.warnDelegate, "Osiągnięto strefę bezpiecznych wartości");
}
wpis = "jakis string";
sw.WriteLine(wpis);
sw.Flush();
wpis = null;
}
if ()
{
if ()
{
ZZZ.Invoke(Uc1.warnDelegate, "Osiągnięto strefę 1");
}
wpis = "jakis string";
sw.WriteLine(wpis);
sw.Flush();
wpis = null;
}
else if ()
{
if ()
{
ZZZ.Invoke(Uc1.warnDelegate, "Osiągnięto strefę 2");
}
wpis = "jakis string";
sw.WriteLine(wpis);
sw.Flush();
wpis = null;
}
//jakiś kod odnośnie rysowania wykresow
ZZZ.Invoke(Uc1.myDelegate);
Thread.Sleep(odstepCzasu * 1000);
}
}
catch (InvalidOperationException e)
{
MessageBox.Show(e.Message);
}
catch (ThreadAbortException)
{
}
}
}
}
Część pliku userControl1.cs:
public delegate void RefreshDelegate();
public delegate void ShowWarningDialogDelegate(string aaa, string bbb, string ccc);
public RefreshDelegate myDelegate;
public ShowWarningDialogDelegate warnDelegate;
public Thread newThread = null;
public Charts wykres = null;
public UserControl1()
{
InitializeComponent();
wykres = new Charts();
wykres.ZZZ = zedGraphControl1;
wykres.Uc1 = this;
myDelegate = new RefreshDelegate(wykres.ZZZ.Refresh);
warnDelegate = new ShowWarningDialogDelegate(minDelegate);
}
private void minDelegate(string strLabel1, string strLabel2)
{
WarningForm forma = new WarningForm(strLabel1, strLabel2);
forma.Show();
}
Czy możecie mi pokazać jak to zsynchronizować w ten sposób aby wszystkie uruchomione wątki miały jednoczesny dostęp do pliku logu w momencie gdy chcą coś zapisać? Teraz to jest niemożliwe. Słyszałem że to jest typowy przykład dla wykorzystania wzorca projektowego producent-konsument ale za cholerę nie wiem jak to tutaj zastosować, jakie funkcje etc.
Będe naprawdę dozgonnie wdzięczny za każdą wskazówkę i pomoc.
Pozd.