Почему очередь не передаёт данные через мютекс из процесса в поток ??
Вот код :
// Применить мьютекс.
using System;
using System.Threading;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
// В этом классе содежится общий ресурс (переменная Queue),
// а также мьютекс(Mtx), управляющий доступом к ней.
class SharedRes
{
//static readonly Queue<string> data = new Queue<string>();
public static Queue<string> data = new Queue<string>();
public static Mutex Mtx = new Mutex();
}
// В этом потоке переменная SharedRes.Queue инкрементируется.
class IncThread
{
int num;
public Thread Thrd;
public IncThread(string name)
{
Thrd = new Thread(this.Run);
Thrd.Name = name;
Thrd.Start();
}
// Точка входа в поток.
void Run()
{
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = "ping",
Arguments = "www.ya.ru",
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
using (var pingProcess = new Process())
{
pingProcess.StartInfo = startInfo;
pingProcess.OutputDataReceived += OutputDataReceived;
pingProcess.Start();
pingProcess.BeginOutputReadLine();
// На этом методе будет ожидание завершения запущенного процесса.
// При получении каждой новой порции данных
// будет вызываться событие OutputDataReceived.
pingProcess.WaitForExit();
}
Console.WriteLine(Thrd.Name + " ожидает мютекс.");
}
private static void OutputDataReceived(object sender, DataReceivedEventArgs e)
{
// Получить мьютекс.
SharedRes.Mtx.WaitOne();
Console.WriteLine("Мы в потоке один");
SharedRes.data.Enqueue(e.Data);
//Console.WriteLine(e.Data);
using (var writer = File.AppendText("log.txt"))
writer.WriteLine(e.Data);
// Освободить мьютекс.
SharedRes.Mtx.ReleaseMutex();
}
}
// В этом потоке переменная SharedRes.Count декрементируеться.
class DecThread
{
int num;
public Thread Thrd;
public DecThread(string name)
{
Thrd = new Thread(new ThreadStart(this.Run));
Thrd.Name = name;
Thrd.Start();
}
// ТОчка входа в поток.
void Run()
{
// Получить мьютекс.
SharedRes.Mtx.WaitOne();
Console.WriteLine("Мы в потоке два");
while (SharedRes.data.Count > 0)
Console.WriteLine(SharedRes.data.Dequeue());
// Освободить мьютекс.
SharedRes.Mtx.ReleaseMutex();
}
}
class MutexDemo
{
static void Main()
{
// Construct three threads.
IncThread mt1 = new IncThread("Инкрементирующий поток");
Thread.Sleep(1); // let the Increment thread start
DecThread mt2 = new DecThread("Декрементирующий поток");
mt1.Thrd.Join();
mt2.Thrd.Join();
}
}
Вот вывод :
dima@komp:~/mita/TCP_IP$ mcs lovla_terminal7.cs
dima@komp:~/mita/TCP_IP$ mono lovla_terminal7.exe
Мы в потоке два
Мы в потоке один
Мы в потоке один
Мы в потоке один
Мы в потоке один
Мы в потоке один
Мы в потоке один
Мы в потоке один
Мы в потоке один
^C