2011-02-10 3 views
2

Я разрабатываю небольшое приложение. Нужна ваша помощь.C# многопоточный подход в GUI

У меня есть таблица из 10 столбцов. Скажем, я выбираю 5 строк в виде списка. Я беру все значения col_1 в списке, передавая его методу.

Если все значения равны, установите значение combo_box1 = "equal" else value = "not equal".

Текущий подход:

У меня есть 10 списков (? Кажется довольно хромой ... не так я уже задал Ques относительно этого ...), один для каждого цв.

10 вызовов метода, который проверяет равенство значений, каждый для одного списка. Впоследствии установите значения поля со списком (10 комбинированных полей).

Если у меня есть 100 записей, я думаю, что время будет увеличиваться. Итак, я думал о внедрении потоков.

усилию Put:

Я использовал this.Invoke (новый делегат ...) подход к теме, которая пытается получить доступ к управлению главного потока. Он работает нормально. Я пытался манипулировать этим в соответствии с моими потребностями. Не мог этого сделать. Пожалуйста, помогите мне, ребята.

[EDIT]

главным виновником был сравнение изображений ... его принимать очень много времени, чтобы закончить ... ниже код ... я храню все изображение (скажем, Col нет 3), скажем, 10 строк в списке ...

// other stuffs [DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)] private static extern int memcmp(IntPtr b1, IntPtr b2, long count);

// create a list of images MemoryStream imageStream = new MemoryStream(tempImage.Data.Data); Bitmap artCoverImage = new Bitmap(imageStream); // culprit ? artCoverList.Add(artCoverImage);

// call the method CheckIfEqual(artCoverList) // culprit ?

// THE method private void CheckIfEqual(artCoverList) { Bitmap tempBitMap = artCoverList[0];

foreach (Bitmap bmp in artCoverList) { if (bmp == null) return false; if (bmp.Size != tempBitMap.Size) return false; var bd1 = tempBitMap.LockBits(new Rectangle(new Point(0, 0), tempBitMap.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); IntPtr bd1scan0 = bd1.Scan0; int stride = bd1.Stride; long len = stride * tempBitMap.Height; var bd2 = bmp.LockBits(new Rectangle(new Point(0, 0), bmp.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); IntPtr bd2scan0 = bd2.Scan0; returnValue = memcmp(bd1scan0, bd2scan0, len) == 0; bmp.UnlockBits(bd2); tempBitMap.UnlockBits(bd1); } }

я провел целый день, чтобы получить это сравнение часть изображения работает ... я не думаю, что часть, где он преобразует MEM поток в bmp является виновником ...

[EDIT 2]

ребят ... нужна ваша помощь ... любая идея ... как сравнить список изображений ... кроме выше .. .

Спасибо,

Dev

+0

Во-первых, в зависимости от того, что вы делаете, увеличение записей до 100 не должно вносить столько разницы, особенно если вы просто разбираете список несколько раз. Во-вторых, нам нужна дополнительная информация. Как вы пытались манипулировать потоковым вызовом? Как именно вы хотите, чтобы поток работал? –

+0

вещь количество столбцов может увеличиться ... я хотел бы позвонить, скажем, 3 потока ... каждая обработка 3 cols ... вот так .. – Dev

ответ

2

Реализация резьбового дизайна имеет свои собственные накладные расходы и повышает сложность. Вы действительно хотите только рассмотреть возможность перехода к многопоточной модели, если производительность недостаточно для обеспечения дополнительной сложности.

Если у вас есть 100 строк, и вы проверяете равенство 10 столбцов, то вы выполняете 1000 проверок равенства. В зависимости от реализации это должно быть тривиальной операцией с незначительными последствиями производительности.

Рассмотрите возможность профилирования вашего приложения, чтобы узнать, есть ли проблема с производительностью.

EDIT
на основе ваших выводов (что сравнение изображений является виновником), вы можете рассмотреть возможность использования простого сравнения контрольной суммы в отношении соответствующих изображений байтовых массивов.

Вот пример того, как сделать так: http://www.dreamincode.net/code/snippet2859.htm

Примечание: MD5 является достаточным в этом случае и должна оказаться немного быстрее.

+0

ну .. после профилирования я нашел педераста, который вызывает задержку ... я отредактировал основные вопросы ... – Dev

+0

Я слышал, что сравнение MD5 медленнее, чем тот, который я использовал ... много исследовал, прежде чем идти на этот подход ... будет сравнивать время, затрачиваемое обоими методами и посмотреть ... я думаю, что это также занимает время во время генерации Bitmap из потока ... есть ли другой способ обработки изображений ...? – Dev

2

Я бы сказал, что вместо использования Invoke проверьте BackgroundWorker. Он имеет события обратного вызова, которые автоматически работают в основном потоке, поэтому он облегчает обновление вашего пользовательского интерфейса, чтобы избежать исключений перекрестных потоков.

BackgroundWorker worker = new BackgroundWorker(); 
worker.RunWorkerCompleted += (s, e) => updateUI(); 
worker.DoWork += (s, e) => longProcess(); 

worker.RunWorkerAsync(); 
+0

рассмотрит это ... спасибо за предложение ... – Dev

+0

Поскольку вы обнаружили, что это только один столбец, вызывающий задержку, несколько потоков не помогут - вам все равно придется ждать, пока отнимает много времени поток конец. Накладные накладные расходы перевесят преимущества для других столбцов. –

+0

Я думал, что если я обработаю 99 из 100 столбцов в основной теме, и этот многоразовый столбец в другой ... я бы смог ускорить общий процесс ... – Dev

0

Один из способов проверить, если все элементы в списке то же запихнуть их в HashSet и проверить количество элементов в HashSet потом: Если у вас есть только один элемент, то они все равны ...

Смежные вопросы