Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2012, 17:40   #1
nats
Пользователь
 
Регистрация: 15.10.2010
Сообщений: 65
По умолчанию Потоки

Доброго время суток.
Сразу хочу заметить что я только начал общения с потоками.
А теперь суть задачи:
Есть интерфейс от которого наследываются 8 классов. В каждом классе есть по одной обьемной функции которые формыруют определенные Репорты (Crystal Report). Дальше в фориче просматриваються елементы в листбоксе, обьявляються соответсвующие класы и вызываеться функция. Если это делать в одном потоке то форма очень долго думает. Поэтому было решено все засунуть в потоки (на каждый клас по потоку).Вот собственно код:
Цитата:
private Dictionary<string, ReportClass> listReport()
{

Dictionary<string, ReportClass> List = new Dictionary<string, ReportClass>();
List<Thread> ListThread = new List<Thread>();
object[] parametr = new object[2];

foreach (ListViewItem item in DocumentList.Items)
{

parametr[0] = List;
parametr[1] = item;
Bla = new Thread(new ParameterizedThreadStart(AddList));
Bla.Start(parametr);
ListThread.Add(Bla);
}

while (true)
{
bool ee = false;
foreach (var item in ListThread)
{
if (item.IsAlive)
{
ee = true;
break;
}
}
if (!ee)
{
break;
}
}

return List;
}

void AddList(object Obj )
{
object[] obj = (object[])Obj;
Dictionary<string, ReportClass> List = (Dictionary<string, ReportClass>) obj[0];
ListViewItem item = (ListViewItem) obj[1];
IReportClasses report = ChooseDocument(item.Name);
try
{

string gg = item.Tag.ToString() + "_" + item.Name;
ReportClass clas = report.FormReport (Convert.ToInt32(item.Tag), IDArea, thisDataSet);
y.WaitOne();
List.Add(gg,clas);
}
finally
{
y.ReleaseMutex();
}
}
Проблема: В самой функции FormReport не хочет обьвляться Crystal Report отчет пишет ошибку An exception 'Microsoft.VisualStudio.Debugger.Ru ntime.CrossThreadMessagingException ' и поток зависает
nats вне форума Ответить с цитированием
Старый 04.03.2012, 17:19   #2
Adyvan
Пользователь
 
Регистрация: 15.01.2011
Сообщений: 24
По умолчанию

Я твой код не понял..
Я работал с потоками и могу с казать, что возможно у тебя потоки обращаются к одним и тем же данным!
Могу посоветовать книгу: Шилдт Г. С# 3.0 Полное руководство. 2010
Там очень хорошо описана работа с потоками!
Adyvan вне форума Ответить с цитированием
Старый 05.03.2012, 00:44   #3
nats
Пользователь
 
Регистрация: 15.10.2010
Сообщений: 65
По умолчанию

да...пересмотрел оформления....неадекватное...извени те...попытка № 2
PHP код:
 private Dictionary<stringReportClasslistReport() //функция где создаються потоки
        
{

            
            List<
ThreadListThread = new List<Thread>();//лист для потоков что бы проверять живы ли они
            
object parametr;//обджект для передачи параметров в функцию
           
            
foreach (ListViewItem item in DocumentList.Items//форич который проходиться по елементам листвиева и вызывает функцию формирования отчетов в потоках
            
{
                
                    
parametr = (object) item;
                    
Thread Bla = new Thread(new ParameterizedThreadStart(AddList));// новый поток который вызывает функцию
                    
Bla.Start(parametr);// передача параметров функции
                    
ListThread.Add(Bla); добавления потока в лист
                
                
            
}
            while (
true)//вайл который бегает по всем потокам и проверяет живы ли они
//так как мне надо отследит когда закончаться все потоки и тогда только дальше выполнять главный
            
{
                
bool ee false;
                foreach (var 
item in ListThread)
                {
                    if (
item.IsAlive)
                    {
                        
ee true;
                        break;
                    }
                }
                if (!
ee)
                {
                    break;
                }
            }
  
void AddList(object Obj)// функция которая вызываеться в потоках
//предназначена для формирования репортов и добавления их Дикшинари
        
{
      
Dictionary<stringReportClass> List = new Dictionary<stringReportClass>(); 
            
ListViewItem item = (ListViewItem)obj;
            
IReportClasses report ChooseDocument(item.Name);//report -  интерфейс классов в которых идет формирования отчетов
//ChooseDocument - функция для выбора каким классом обявить интерфейс 
            
try
            {
               
                
string gg item.Tag.ToString() + "_" item.Name;//ключ дикшинари 
                
ReportClass clas =  report.FormReport(Convert.ToInt32(item.Tag), IDAreathisDataSet);//вызывает функцию которая формируют отчет соответсвенно от того класа который сидит в интерфейсе report 
                
y.WaitOne();//y екземпляр Мютекса закрывает доступ для других потоком
                
List.Add(gg,clas); // добавления в дикшинари
            
}
            finally
            {
                
y.ReleaseMutex();// Снятия замка
            
}
        }
public 
ReportClass FormReport(int idint AreaIdDataForReport ds)// функция  формирования одного с отчетов
        
{
            
CRDodatok1 dod1 = new CRDodatok1();// этот обьект не хочет обьявляться //
//CRDodatok1 - это кристал репорт отчет 
Но если вызывать обьявления dod1 в главном потоке то все нормально.
Adyvan, Спасибо за Шилда. Я вроде закрываю мютексом. Но может не там и не тем. Если кто увидит ошибку укажите пожалуйста
nats вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки Killer_Pooh Общие вопросы Delphi 4 01.06.2011 02:28
[C#] Потоки Lemo C# (си шарп) 2 24.05.2011 21:50
Потоки. FieStik Общие вопросы C/C++ 4 23.05.2011 14:12
Потоки _PROGRAMM_ Помощь студентам 9 26.09.2010 19:27
потоки tanek Помощь студентам 6 15.03.2010 21:42