Подключение к Quik и запуск DDE

Подключение к Quik и запуск DDE
Atom
1/24/2011
vvt


Пробую подключение к Quik и запуск DDE из примеров (Sample, SampleSMA). Все происходит очень медленно, поискал по форуму, есть несколько сообщений с такими же проблемами. Железо вроде не самое слабое (Phenom II X2 555/8Gb/SSD), система Windows 7 Ultimate 64bit. Запускаются Quik и примеры от имени администратора. Хотелось бы все-таки с помощью Михаила докопаться до возможных причин таких тормозов.

В связи с этим первый вопрос: после установки соединения с Квиком через QuikTrader.Connect() и поступления события Connected секунд где-то через 10 в Квике появляется окно "Выбор активных счетов и задание их очередности", которое висит и пропадает где-то через 30 секунд. Так и должно быть?

Вот код этого консольного приложения:

			Console.WriteLine("Запуск...");

			try
			{
				var waitHandle = new AutoResetEvent(false);

				// создаем шлюз к Quik-у
				var trader = new QuikTrader(@"C:\FinamJunior\info.exe");

				// подписываемся на событие успешного подключения
				// все действия необходимо производить только после подключения
				trader.Connected += () =>
				{
					Console.WriteLine("Подключение было произведено успешно.");

					// извещаем об успешном соединени
					waitHandle.Set();
				};

				Console.WriteLine("Производим подключение...");

				trader.Connect();

				// дожидаемся события об успешном соединении
				waitHandle.WaitOne();
				Console.ReadKey();

				trader.Dispose();
			}
			catch (Exception ex)
			{
				Console.WriteLine(ex);
				Console.ReadKey();
			}


Tags:


Thanks:


<< < 3 4 5 6  >
Артем_2

Avatar
Date: 7/18/2011
Reply


При этом время увеличивапется, если добавить условие на Linq

var wins = SystemWindow.AllToplevelWindows.Where(w=>w.Process.Id == AppDomain.GetCurrentThreadId()).ToArray();
, тогда

EnumWindows time: 00:00:00.0009348 Windows count: 730 AllToplevelWindows time: 00:00:00.9365030 Windows count: 0

Видать, зря я EnumWindows так катигорично забраковал

Thanks:

Артем_2

Avatar
Date: 7/18/2011
Reply


Видимо, время тратится на доступ к w.Process

Может быть тогда можно попробовать для получения окон квика сначала ограничить выборку из AllToplevelWindows по какому-нить нетормозному признаку (по ClassName или еще как), а потом уже фильтровать по w.Process

Thanks:

esper

Avatar
Date: 7/18/2011
Reply


Артем_2: При этом время увеличивапется, если добавить условие на Linq

var wins = SystemWindow.AllToplevelWindows.Where(w=>w.Process.Id == AppDomain.GetCurrentThreadId()).ToArray();

У меня это условие не очень сильно увеличивает время

EnumWindows time: 00:00:00.0014281 Windows count: 384 AllToplevelWindows time: 00:00:00.2985305 Windows count: 0

Вообще, дело тут не в LINQ, дело в том, что SystemWindow.Process выполняет пару дополнительных действий, в частности тормозит Process.GetProcessById

namespace ConsoleApplication3
{
	using System;
	using System.Diagnostics;
	using System.Linq;
	using System.Runtime.InteropServices;
	using ManagedWinapi.Windows;

	internal class Program
	{
		#region Delegates

		public delegate bool CallBackPtr(int hwnd, int lParam);

		#endregion

		[DllImport("user32.dll")]
		public static extern int EnumWindows(CallBackPtr callPtr, int lPar);

		[DllImport("user32.dll", SetLastError = true)]
		static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

		static int GetProcessId(IntPtr hwnd)
		{
			int pid;
			GetWindowThreadProcessId(hwnd, out pid);
			//Process.GetProcessById(pid);
			return pid;
		}

		private static void Main()
		{
			var watch = Stopwatch.StartNew();
			
			var windowsCount = 0;
			EnumWindows((hwnd, lParam) =>
			{
				windowsCount++;
				return true;
			}, 0);
			
			watch.Stop();
			Console.WriteLine("EnumWindows time: {0} Windows count: {1}", watch.Elapsed, windowsCount);

			watch = Stopwatch.StartNew();
			//var wins = SystemWindow.AllToplevelWindows.Where(w => w.Process.Id == AppDomain.GetCurrentThreadId()).ToArray();
			var wins = SystemWindow.FilterToplevelWindows(w => GetProcessId(w.HWnd) == AppDomain.GetCurrentThreadId());
			watch.Stop();
			Console.WriteLine("AllToplevelWindows time: {0} Windows count: {1}", watch.Elapsed, wins.Length);

			Console.ReadLine();
		}
	}
}

P.s. посмотреть бы как это все используется в S#... Alexander, можете показать эту часть исходника?

Thanks: Alexander

Alexander

Avatar
Date: 7/18/2011
Reply


esper: P.s. посмотреть бы как это все используется в S#... Alexander, можете показать эту часть исходника?

Оставьте почту, отправлю весь QuikTerminal

Thanks:

Артем_2

Avatar
Date: 7/18/2011
Reply


Вообще, дело тут не в LINQ, дело в том, что SystemWindow.Process выполняет пару дополнительных действий, в частности тормозит Process.GetProcessById Это понятно... Время тратится на доступ к w.Process (см. #44) Я вот и говорю, может надо типа того че-то сделать:



 var wins = SystemWindow.AllToplevelWindows.Where(w => w.ClassName.Contains("VBF")).Where(w => w.Process.Id == AppDomain.GetCurrentThreadId());

Эх, нету ни квика ни кода из QuikTerminal сейчас под рукой чтоб проверить[crying]

Thanks:

Alexander

Avatar
Date: 7/18/2011
Reply


esper: Вообще, дело тут не в LINQ, дело в том, что SystemWindow.Process выполняет пару дополнительных действий, в частности тормозит Process.GetProcessById

А после такого измения кода как быстро стало отрабатывать?

Thanks:

Артем_2

Avatar
Date: 7/18/2011
Reply


У меня это условие не очень сильно увеличивает время

Цитата: EnumWindows time: 00:00:00.0014281 Windows count: 384 AllToplevelWindows time: 00:00:00.2985305 Windows count: 0 У вас окон 384 выводится, а у меня больше 700

Thanks:

Alexander

Avatar
Date: 7/18/2011
Reply


У меня это условие не очень сильно увеличивает время

EnumWindows time: 00:00:00.0014281 Windows count: 384 AllToplevelWindows time: 00:00:00.2985305 Windows count: 0

В 100 раз. Довольно сильно :)

Thanks:

esper

Avatar
Date: 7/18/2011
Reply


Alexander: Оставьте почту, отправлю весь QuikTerminal отправил в личку

Alexander: Это понятно... Время тратится на доступ к w.Process (см. #44) Я вот и говорю, может надо типа того че-то сделать Если просто попробовать поменять предикат, как в предыдущем моем сообщении?

Thanks:

esper

Avatar
Date: 7/18/2011
Reply


Alexander: А после такого измения кода как быстро стало отрабатывать?

С измененным предикатом:

EnumWindows time: 00:00:00.0018250 Windows count: 393 AllToplevelWindows time: 00:00:00.0037758 Windows count: 0

без:

EnumWindows time: 00:00:00.0012580 Windows count: 393 AllToplevelWindows time: 00:00:00.3220401 Windows count: 0

Thanks:
<< < 3 4 5 6  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy