Вернуться   Форум программистов > Форум Программирование > Форум .NET

.NET

Технология .NET

Ответ
 
Старый 05.08.2005, 02:52   #1
jerry
Пользователь
 
Регистрация: 04.07.2004
Сообщений: 97
jerry пока не определено
По умолчанию Долгое время при сканировании

У меня вот какой вопрос. Моя прога анализирует величину каталогов. Для этого соответственно ей приходится просматривать все содержимое заданного лог. диска. Так вот как только начинается этот процесс с формой ничего не сделать. Конкретно меня интересует: не поменять размер в ручную, не поменять содержание надписи Label, находящейся на форме. Если же сканировать разделы с большой вложенностью каталогов, то система становится не доступной. Вот код:
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 private void Scaner(DirectoryInfo direct)
                {
                          // злополучный Label 
                this.lblpath.Text=direct.FullName.ToString();                  
 
 
 
                        foreach(DirectoryInfo dir in direct.GetDirectories())
                        {
                                HT.Add(dir.FullName.GetHashCode(),0D);
                                this.Scaner(dir);
                        }
                
                        FileInfo[]finfo=direct.GetFiles();
 
                        double files=0;
                        foreach(FileInfo file in finfo)
                        {
                        double x=(double)HT[direct.FullName.GetHashCode()];
                        x+=(double)file.Length;
 
                                //это для ProgressBar 
                                prom+=(double)file.Length;
 
                if(((int)((double)prom*100/this.discSize))>=1)
                {
 
                int y=(int)Math.Round(((double)prom*100/this.discSize),0);
                                        progBar.Value+=y;
                                        prom=0;
                }
                                
                                HT[direct.FullName.GetHashCode()]=x;
                fileHT.Add(file.FullName.GetHashCode(),(double)file.Length);
                                files+=1;
                        }
 
 
                        fileHT.Add(direct.FullName.GetHashCode(),files);
 
                        if(!(direct.Parent==null))
                        {
                                
                double x=(double)HT[direct.Parent.FullName.GetHashCode()];
                x+=(double)HT[direct.FullName.GetHashCode()];
                HT[direct.Parent.FullName.GetHashCode()]=x;
                                
                        }
                        
                        
                }
 
jerry вне форума  
Старый 05.08.2005, 07:07   #2
Messir
Местный
 
Регистрация: 05.08.2003
Сообщений: 1,407
Messir пока не определено
По умолчанию RE: Задумывается при сканировании

Два варианта решения проблемы:
1. Выполняй сканирование каталогов отдельным потоком
2. Время от времени вызывай
Код
1
Application.DoEvents();
И оптимизируй свой код. Например, незачем постоянно заново вызывать
Код
1
GetHashCode()
для одних и тех же объектов.
Messir вне форума  
Старый 05.08.2005, 17:47   #3
rulez
Местный
 
Регистрация: 07.12.2002
Сообщений: 467
rulez пока не определено
По умолчанию RE: Задумывается при сканировании

Лучше всего подобные вещи запускай в отдельном потокеасинхронно. Собственно, для того последнее и сделано.
rulez вне форума  
Старый 06.08.2005, 14:42   #4
jerry
Пользователь
 
Регистрация: 04.07.2004
Сообщений: 97
jerry пока не определено
По умолчанию RE: Задумывается при сканировании

спасибо, мужики, ща сделаем
jerry вне форума  
Старый 06.08.2005, 17:52   #5
jerry
Пользователь
 
Регистрация: 04.07.2004
Сообщений: 97
jerry пока не определено
По умолчанию RE: Задумывается при сканировании

Докладываю по результатам проделанной работы. Работа проги особенно не изменилась. Label так и не меняет надпись. Странно еще то, что после работы сканера надписи присваивается путь последнего проверенного каталога. Интересно что на входе в Scaner() в пазделе Locals Vis.Stud. такая строка напротив св-ва Text надписи error: cannot obtain value. Т.е. по какой-то причине не может присвоить значение надписи.
При работе метода Scaner() курсор даже не меняет вид на краях формы(стрелки при расширении формы), т.е. изменить размер просто не возможно почему-то. Это не принципиальный конечно вопрос, но хочется чтобы все работало так как запланированно.
Как задумывается ещё не проверил, на ноутбуке не те объемы. Дома протестирую на своих 80 Гб.
Обновленный код привожу ниже:
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
 
                       ..
                       ..
                       ..
 
                        dirForScan=dir;
                ThreadStart threadDelegate = new ThreadStart(this.Scaner);
                        Thread newThread = new Thread(threadDelegate);
                        newThread.Start();
                        newThread.Join();
                                                
                        Form2 form=new Form2(this,this.logDisc);
 
                        form.Show();
                        
                }
                
                private void Scaner()
                {
                        DirectoryInfo direct=this.dirForScan;
                        
                ThreadStart labelDelegate = new ThreadStart(this.labelText);
                        Thread labelThread = new Thread(labelDelegate);
                        labelThread.Start();
                        labelThread.Join();
                        
                        foreach(DirectoryInfo dir in direct.GetDirectories())
                        {
                                HT.Add(dir.FullName.GetHashCode(),0D);
                                this.dirForScan=dir;
                                this.Scaner();
                        }
                        
                
 
                        FileInfo[]finfo=direct.GetFiles();
 
                        double files=0;
                        foreach(FileInfo file in finfo)
                        {
                                int dirHashCode=direct.FullName.GetHashCode();
                                double x=(double)HT[dirHashCode];
                                x+=(double)file.Length;
                                
                            prom+=(double)file.Length;
 
                                if(((int)((double)prom*100/this.discSize))>=1)
                                {
 
                int y=(int)Math.Round(((double)prom*100/this.discSize),0);
                                        progBar.Value+=y;
                                        prom=0;
                                }
                                
                                HT[dirHashCode]=x;
                fileHT.Add(file.FullName.GetHashCode(),(double)file.Length);
                                files+=1;
                        }
                        fileHT.Add(direct.FullName.GetHashCode(),files);
 
                        if(!(direct.Parent==null))
                        {
                double x=(double)HT[direct.Parent.FullName.GetHashCode()];
                                x+=(double)HT[direct.FullName.GetHashCode()];
                                HT[direct.Parent.FullName.GetHashCode()]=x;
                                
                        }
                        
                                                Application.DoEvents();
                }
 
                private void labelText()
                {
                        this.lblpath.Text=dirForScan.FullName.ToString();
                        Application.DoEvents();
                }
 
jerry вне форума  
Старый 06.08.2005, 18:24   #6
jerry
Пользователь
 
Регистрация: 04.07.2004
Сообщений: 97
jerry пока не определено
По умолчанию RE: Задумывается при сканировании

Ещё у меня интересный случай, судя по всему у меня два файла с одинаковыми HashCode-ами полных имен, поэтому один из них не добавляется. Это вообще возможно? Есть ли возможность создать массив строка-число без этих HashCode-ов?
jerry вне форума  
Старый 07.08.2005, 01:03   #7
jerry
Пользователь
 
Регистрация: 04.07.2004
Сообщений: 97
jerry пока не определено
По умолчанию RE: Задумывается при сканировании

У меня еще вопрос к господину rules. Когда-то я спрашивал про добавление битовых картинок в TreeView. Вы меня отправили на MSDN, за что Вам огромное спасибо(без шуток). Вообщем к этой теме пришлось опять вернуться. Шаблон кода я нашёл, но физического смысла не пойму. Я бы на русском языке голову бы ломал, а про английский и говорить нечего. Какой смысл может иметь строка
Код
1
2
3
 
        myImageList1.ImageStream =((System.Windows.Forms.ImageListStreamer)(resources.GetObject("myImageList1.ImageStream")));
 
и как в этот Stream загнать картинку.

обязательно ли передавать this.components конструктору myImageList1
Код
1
2
3
4
 
this.components = new System.ComponentModel.Container();
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
 
Одним словом у меня пока вместо картинок пустые места.
Хотя бы в краце можно пояснить?
jerry вне форума  
Старый 07.08.2005, 04:32   #8
Messir
Местный
 
Регистрация: 05.08.2003
Сообщений: 1,407
Messir пока не определено
По умолчанию RE: Задумывается при сканировании

Цитата:
Сообщение от jerry
Докладываю по результатам проделанной работы. Работа проги особенно не изменилась. Label так и не меняет надпись. Странно еще то, что после работы сканера надписи присваивается путь последнего проверенного каталога. Интересно что на входе в Scaner() в пазделе Locals Vis.Stud. такая строка напротив св-ва Text надписи error: cannot obtain value. Т.е. по какой-то причине не может присвоить значение надписи.
При работе метода Scaner() курсор даже не меняет вид на краях формы(стрелки при расширении формы), т.е. изменить размер просто не возможно почему-то. Это не принципиальный конечно вопрос, но хочется чтобы все работало так как запланированно.
Как задумывается ещё не проверил, на ноутбуке не те объемы. Дома протестирую на своих 80 Гб.
Обновленный код привожу ниже:
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
 
                       ..
                       ..
                       ..
 
                        dirForScan=dir;
                ThreadStart threadDelegate = new ThreadStart(this.Scaner);
                        Thread newThread = new Thread(threadDelegate);
                        newThread.Start();
                        [bold]newThread.Join();[/bold] 
                                                
                        Form2 form=new Form2(this,this.logDisc);
 
                        form.Show();
                        
                }
                
                private void Scaner()
                {
                        DirectoryInfo direct=this.dirForScan;
                        
                ThreadStart labelDelegate = new ThreadStart(this.labelText);
                        Thread labelThread = new Thread(labelDelegate);
                        labelThread.Start();
                        labelThread.Join();
                        
                        foreach(DirectoryInfo dir in direct.GetDirectories())
                        {
                                HT.Add(dir.FullName.GetHashCode(),0D);
                                this.dirForScan=dir;
                                this.Scaner();
                        }
                        
                
 
                        FileInfo[]finfo=direct.GetFiles();
 
                        double files=0;
                        foreach(FileInfo file in finfo)
                        {
                                int dirHashCode=direct.FullName.GetHashCode();
                                double x=(double)HT[dirHashCode];
                                x+=(double)file.Length;
                                
                            prom+=(double)file.Length;
 
                                if(((int)((double)prom*100/this.discSize))>=1)
                                {
 
                int y=(int)Math.Round(((double)prom*100/this.discSize),0);
                                        progBar.Value+=y;
                                        prom=0;
                                }
                                
                                HT[dirHashCode]=x;
                fileHT.Add(file.FullName.GetHashCode(),(double)file.Length);
                                files+=1;
                        }
                        fileHT.Add(direct.FullName.GetHashCode(),files);
 
                        if(!(direct.Parent==null))
                        {
                double x=(double)HT[direct.Parent.FullName.GetHashCode()];
                                x+=(double)HT[direct.FullName.GetHashCode()];
                                HT[direct.Parent.FullName.GetHashCode()]=x;
                                
                        }
                        
                                                Application.DoEvents();
                }
 
                private void labelText()
                {
                        this.lblpath.Text=dirForScan.FullName.ToString();
                        Application.DoEvents();
                }
 
ну а Join-то зачем? Он будет блокировать основной поток на все время сканирования - о каком обновлении может идти речь?
Messir вне форума  
Старый 07.08.2005, 12:47   #9
jerry
Пользователь
 
Регистрация: 04.07.2004
Сообщений: 97
jerry пока не определено
По умолчанию RE: Задумывается при сканировании

Мне нужно, чтобы
Form2 form=new Form2(this,this.logDisc);

form.Show();
выполнялось только после выполнения сканирования, иначе Form2 не построить.
jerry вне форума  
Старый 28.12.2005, 21:45   #10
chatos
Новичок
 
Регистрация: 28.12.2005
Сообщений: 1
chatos пока не определено
По умолчанию RE: Задумывается при сканировании

>> myImageList1.ImageStream =((System.Windows.Forms.ImageListStreamer)(resourc es.GetObject("myImageList1.ImageStream")));

>> и как в этот Stream загнать картинку.

>> обязательно ли передавать this.components конструктору myImageList1

>> this.components = new System.ComponentModel.Container();
>> System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));

В ресурсном файле формы Form1 (файл имеет название Form1.resx) должен быть ресурс с именем myImageList1.ImageStream и с типом из одного из типов, поддерживаемых ImageList-ом.
Первая строка с кодом собственно и загоняет картинку.
По идее достаточно если последние две строчки кода будут наличествовать в сгенерированной компилятором части кода, относящегося к форме на которой имеется этот ImageList.
chatos вне форума  
Ads
Ответ
Опции темы

Похожие темы
Тема Автор
.NET ПРоцесс сборки мусора.
Здраствуйте Всем. Если на объект в куче больше ничего не указывает, то он в конечно итоге уничтожается, а если например так public __gc class A { ... public: double a __gc ; ...
Vyacheslav
.NET Нужен контрол для построения графиков / диаграмм !
Господа! Просто надо. Конечно же шароварный. VS 2003 NetFrameWork 1.1 Да пребудет с Вами сила, уважаемые Джедаи!
# Darth Vader #
TypeLoadException .NET
Доброе время суток. Уже не знаю. В сборке на VC++ есть такой код public __gc __interface IEquation_Base { __property int get_row(); __property int get_col(); };
Vyacheslav
СРОЧНО! В западную компанию требуется Программист .NET
В крупную международную консалтинговую компанию срочно требуется программист .NET, ASP.NET. Требования: - От 1 года - опыт разработки сложных WEB-приложений с использованием техологий .NET, ASP.NET...
Аллен
Подключение Dll .NET
Помогите не могу разобраться как этим пользоваться 1. Трудность незнание правил написания (синтаксис) на языке VB.NET 2. Немогу понять как пользоваться MSDN написаны функции а пример кода нет ...
AleksS
ошибка ...denotes a ''property'' where a ''method'' was expected .NET
Ошибка:C:InetpubwwwrootAspdotnetWebUserControl1.ascx.cs(43): ''System.Data.DataSet.Tables'' denotes a ''property'' where a ''method'' was expected Как исправить следующую ошибку и откуда она...
servannin



Текущее время: 12:03. Часовой пояс GMT +4.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.

Рейтинг@Mail.ru