Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с FolderBrowseDialog 
:(
    Опции темы
botusai
Дата 11.4.2008, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 24.9.2007

Репутация: нет
Всего: нет



Суть проблемы: в приложении используется FolderBrowseDialog (далее диалог). Я решил сделать пару мест в приложении многопоточными для ускорения работы, после чего вызов диалога приводит к исклбчению, где он говорит что надо поставить у Main'a атрибут [STAThread], если ставить этот атрибут, то тогда не получается делать многопотчное приложение, как быть?
PM MAIL   Вверх
marcusmae
Дата 11.4.2008, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 22
Всего: 39



botusai, а почему не получается делать многопоточное приложение? = Можно посмотреть на неработающий код?


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
tol05
Дата 11.4.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



botusai, нужно использовать Invoke для твоего FolderBrowseDialog-а
пример
Код

Thread t = new Thread(DoWork);
t.Start();
....
private void DoWork() 
        {
            Invoke(new MethodInvoker(delegate { folderBrowserDialog1.Description = "something"; }));            
        }



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
botusai
Дата 13.4.2008, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 24.9.2007

Репутация: нет
Всего: нет



Вот код многопоточной части
Код


int MAXTHREADS = 64;
            PaletteThreadParams [] data = new PaletteThreadParams[MAXTHREADS];
            ManualResetEvent[] events = new ManualResetEvent[MAXTHREADS];
            PaletteThread[] threads = new PaletteThread[MAXTHREADS];

            for(int i=0; i < MAXTHREADS; i++)
            {
                //это заполнение параметров для каждого потока
                data[i].isIsotermActive = session.Settings.IsIsotermsActive;
                data[i].palette = session.Palette;
                data[i].isoPalette = isoPalette;
                data[i].spans = tempSpans;
                data[i].isoSpans = tempIsoSpans;
                threads[i] = new PaletteThread();
                events[i] = new ManualResetEvent(false);
                threads[i].Event = events[i];
            }
            int tmpcount = (int)(palette.High) - (int)(palette.Low);
            int count1 = tmpcount;
            //а это главный цикл, где создаются потоки
            for (int i = 0; i <= tmpcount / MAXTHREADS + 1; i++)
            {
                int localCount = Math.Min(MAXTHREADS, count1+1);
                for (int j = 0; j < localCount; j++)
                {
                    events[j].Reset();
                    data[j].value = palette.High - j - i * MAXTHREADS;
                    ThreadPool.QueueUserWorkItem(threads[j].Execute, (object)data[j]);
                }
                WaitHandle.WaitAll(events);  
                count1 -= MAXTHREADS;

                for (int j = 0; j < localCount; j++)
                {
                    myPen.Color = threads[j].resColor;                    
                    for (int k = 0; k < width; k++)
                    {
                        paletteBmp.SetPixel(k, i*MAXTHREADS+j, myPen.Color);                        
                    }
                }
            }


Косяк выскакивает на строке 
WaitHandle.WaitAll(events);  

Вот текст еррора
An unhandled exception of type 'System.NotSupportedException' occurred in mscorlib.dll

Additional information: WaitAll for multiple handles on a STA thread is not supported.

WaitHandle нужен для синхронизации. Или его можно чем-то заменить?

Это сообщение отредактировал(а) botusai - 13.4.2008, 18:26
PM MAIL   Вверх
tol05
Дата 14.4.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



погуглил на эту тему
вот
вот

мысль - использовать другой способ синхронизации. Какой? Тебе смотреть. Может поможет простой lock?


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.