none
Синхронизация автономных приложений RRS feed

  • Вопрос

  • Всем привет!

    Один и тот же исполняемый файл запущен одновременно четыре раза -
    четыре автономных идентичных приложения.
    Нужна синхронизация для поочередного доступа к одному 
    из файлов данных.


    13 февраля 2015 г. 9:34

Ответы

Все ответы

  • Добрый день.

    Вот здесь пример на Mutex посмотрите. Как раз синхронизация доступа к файлам.

    • Помечено в качестве ответа QazRdx 13 февраля 2015 г. 10:59
    13 февраля 2015 г. 10:44
    Отвечающий
  • Создавать мьютекс, когда экземпляр обращается к файлу?
    13 февраля 2015 г. 10:47
  • Не обязательно при обращении к файлам.
    Это для синхронизации процессов.
    13 февраля 2015 г. 10:59
  • Спасибо!
    13 февраля 2015 г. 10:59
  • Почему-то не получается.
    Запускаю - появляются три пустых окна 
    и никакого движения.
    Ставлю точки останова сразу после Main
    в обоих запускаемых программах,
    и даже сюда управление не передается.
    .
    using System;
    using System.ComponentModel;
    using System.Threading;
    using System.Diagnostics;
    
    class Program
    {	static void Main(string[] args)
    	{	Mutex mut = new Mutex(true, "MutexForFile");
    		Process writer = new Process();
    		writer.StartInfo.FileName = "D:\\_D\\__Work\\_C#\\Mutex\\MutexOne\\MutexOne\\bin\\Debug\\MutexOne.exe";
    		Process reader = new Process();
    		reader.StartInfo.FileName = "D:\\_D\\__Work\\_C#\\Mutex\\MutexTwo\\MutexTwo\\bin\\Debug\\MutexTwo.exe";
    try	{	writer.Start();	}	catch	{	Console.WriteLine ("Writter - Err"); }
    /* *** */ mut.ReleaseMutex(); try { reader.Start(); } catch { Console.WriteLine ("Reader - Err"); } writer.WaitForExit(); reader.WaitForExit(); Console.ReadKey(); } }

    using System;
    using System.ComponentModel;
    using System.IO;
    using System.Threading;
    
    class Program
    {	static void Main	(	string[] args	)
    	{	Mutex mut = Mutex.OpenExisting	(	"MutexForFile"	);
    		Random rnd = new Random();           
    		for (int i = 0; i < 100000; i++)
    		{	mut.WaitOne();
    			StreamWriter sw = new StreamWriter("D:\\_D\\__Work\\_C#\\Mutex\\1.txt", true);
    			int j = rnd.Next(100000);
    			sw.WriteLine(j);
    			Console.WriteLine("Записано {0}", j);
    			sw.Close();
    			mut.ReleaseMutex();
    			Thread.Sleep(100);
    }	}	}

    using System;
    using System.ComponentModel;
    using System.IO;
    using System.Threading;
    
    class Program 
    {	static void Main(string[] args)
    	{	Mutex mut = Mutex.OpenExisting("MutexForFile");
    		for (int i=0;i<100000;i++)
    		{	mut.WaitOne();
    			if	(	File.Exists("D:\\_D\\__Work\\_C#\\Mutex\\1.txt")	)
    			{	StreamReader R = new StreamReader("D:\\_D\\__Work\\_C#\\Mutex\\1.txt");
    				while (!R.EndOfStream)	Console.WriteLine(R.ReadLine());
    				R.Close();
    				File.Delete("1.txt");
    			}	mut.ReleaseMutex();
    }	}	}




    • Изменено QazRdx 13 февраля 2015 г. 18:59
    13 февраля 2015 г. 18:08
  • В запускающей программе пропущен оператор -

    mut.ReleaseMutex();

    Исправил - заработало.
    В предыдущем посте добавил и
    отметил значком /* *** */

    Алексей, в блоге ошибка!
    • Изменено QazRdx 13 февраля 2015 г. 19:02
    13 февраля 2015 г. 18:57
  • Хм, вроде у меня освобождение мутекса и после записи и после чтения есть...
    16 февраля 2015 г. 6:55
    Отвечающий
  • Да, но без входного разрешения все зависает.
    16 февраля 2015 г. 10:40
  • Все, понял, вот так должно быть:

    Mutex mut = new Mutex(false, "MutexForFile");
    16 февраля 2015 г. 10:44
    Отвечающий
  • Да! 
    Ну, а я решил проблему как обычно -
    с помощью молотка, зубила и ...
    16 февраля 2015 г. 11:07