none
LogPrint из нескольких потоков RRS feed

  • Вопрос

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

    Еще один вопрос в продолжение ТЕМЫ.
    Запускаются несколько задач,  экземпляров одного и того же exe - файла.
    После каждого запуска в РичТекстБоксе в реальном времени должна появиться соответствующая запись,
    но, несмотря на специально организованный Invoke, эти записи одна за другой появляются 
    только лишь после завершения всех этих запущенных задач. Что здесь не так?

    using System;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Collections.Concurrent;
    using System.Diagnostics;
    namespace StarterWin
    {	public partial class MainForm : Form
    	{	public MainForm()
    		{	InitializeComponent();
    			Action	ActLog	 =	new Action ( Log );
    			ActLog.BeginInvoke ( null,null );
    			LogQueue = new ConcurrentQueue<string>();
    			btStart.Select();
    		}
    		private void btStart_Click ( object o,EventArgs e) { Start(); } // Кнопка "Start"
    		static ConcurrentQueue<string> LogQueue;
    		static AutoResetEvent LogMessageIsReadyEvent = new AutoResetEvent ( false );
    		public void LogPrint ( string logString	)
    		{	LogQueue.Enqueue ( logString );
    			LogMessageIsReadyEvent.Set();
    		}
    		public void Log	 ()
    		{	string Message;
    			while ( true )
    			{	LogMessageIsReadyEvent.WaitOne();
    				LogMessageIsReadyEvent.Reset();
    				Invoke
    				(	new MethodInvoker
    					(	() =>
    						{	while ( LogQueue.Count > 0 )
    							{	LogQueue.TryDequeue ( out Message );
    								rtbLog.AppendText(Message+"\n"); // RichTextBox
    								rtbLog.ScrollToCaret();
    						}	}
    				)	);
    		}	}
    		public void Start ()
    		{	const int CoreNum = 4;
    			Task<long> [] TaskArr	= new Task<long> [ CoreNum ];
    			Func<object, long> F = ( object obj ) =>
    			{	int i = ( int ) obj;
    				LogPrint ( "Task № "+ i ); // Печать в РичТекстБокс
    				Process P = new Process ();	
    				P.StartInfo.FileName = ExeFileName;
    				P.StartInfo.Arguments = i<4 ? ("0	"+ i.ToString()) : ("1	"+ (i-4).ToString());
    				P.Start();
    				P.WaitForExit();
    				LogPrint ( "Task № "+ i + " is finished" ); // Печать в РичТекстБокс
    				return Environment.TickCount;
    			};
    			for ( int i=0;i<CoreNum;i++) TaskArr[i] = Task<long>.Factory.StartNew ( F, i ); // Запуск 
    			Task.WaitAll ( TaskArr );
    			LogPrint ( "\nWaitAll is occured\n" );
    }	}	}
    

    6 ноября 2015 г. 2:12

Ответы

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

    Запустите метод Log в отдельном потоке.

    • Помечено в качестве ответа QazRdx 16 ноября 2015 г. 13:41
    6 ноября 2015 г. 7:08
    Отвечающий
  • У Вас цикл обработки сообщений в интерфейсом потоке заблокирован. Он висит в ожидании завершения задач в методе Start, вызванном по нажатию кнопки. Поэтому все вызовы Invoke также блокируются до момента возврата из метода Start.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа QazRdx 16 ноября 2015 г. 13:44
    7 ноября 2015 г. 7:41
  • Сорри! Был в отъезде!

    kosuke904 - да, Вы правы, это моя ошибка. Спасибо!

    Сорри-сорри-сорри!

    Этот вопрос уже рассматривался и хуже всего то,
    что я же на него уже удачно ответил...
    То ли с памятью моей что-то стало,
    то ли просто глупость зашкаливает,
    то ли еще что...
    Не судите строго - бывает...
    https://social.msdn.microsoft.com/Forums/ru-RU/ec08e79e-fa93-4a75-931c-ce73160aecec/-

    • Помечено в качестве ответа QazRdx 16 ноября 2015 г. 13:41
    16 ноября 2015 г. 13:41

Все ответы

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

    Запустите метод Log в отдельном потоке.

    • Помечено в качестве ответа QazRdx 16 ноября 2015 г. 13:41
    6 ноября 2015 г. 7:08
    Отвечающий
  • У Вас цикл обработки сообщений в интерфейсом потоке заблокирован. Он висит в ожидании завершения задач в методе Start, вызванном по нажатию кнопки. Поэтому все вызовы Invoke также блокируются до момента возврата из метода Start.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа QazRdx 16 ноября 2015 г. 13:44
    7 ноября 2015 г. 7:41
  • Сорри! Был в отъезде!

    kosuke904 - да, Вы правы, это моя ошибка. Спасибо!

    Сорри-сорри-сорри!

    Этот вопрос уже рассматривался и хуже всего то,
    что я же на него уже удачно ответил...
    То ли с памятью моей что-то стало,
    то ли просто глупость зашкаливает,
    то ли еще что...
    Не судите строго - бывает...
    https://social.msdn.microsoft.com/Forums/ru-RU/ec08e79e-fa93-4a75-931c-ce73160aecec/-

    • Помечено в качестве ответа QazRdx 16 ноября 2015 г. 13:41
    16 ноября 2015 г. 13:41