Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 52

При выборе следующего за выбранным файла сообщается, что он используется в другом процессе

05.12.2012, 18:40. Показов 1024. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите исправить ошибку. не пойму в чем дело следующий за выбранным файл (если выбран не первый и не последний) не открывается и говорится что он используется в другом процессе. при этом нигде он кроме вроде бы и не используется.

C#
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.IO;
 
namespace WFAppImageCache
{
    public partial class FormImages : Form
    {
        public FormImages()
        {
            InitializeComponent();
        }
 
        volatile Dictionary<string, Image> HashImages = new Dictionary<string, Image>();
 
        private void AddInHashImages(string s)
        {
            if (!HashImages.ContainsKey(s))
            {
                FileStream f = new FileStream(@s, FileMode.Open);
                Image img = new Bitmap(f);
                HashImages.Add(s, img);
                f.Close();
            }
        }
 
        private void listBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            string s = listBox.SelectedItem.ToString();
            if (!HashImages.ContainsKey(s))
            {
                FileStream f = new FileStream(@s, FileMode.Open);
                Image img = new Bitmap(f);
                Task task = null;
                pictureBox.BackgroundImage = img;
                if (listBox.SelectedIndex != 0)
                {
                    s = listBox.Items[listBox.SelectedIndex - 1].ToString();
                    if (!HashImages.ContainsKey(s))
                    {
                        task = new Task(() => AddInHashImages(s));
                        task.Start();
                    }
                }
                if (listBox.SelectedIndex != listBox.Items.Count - 1)
                {
                    s = listBox.Items[listBox.SelectedIndex + 1].ToString();
                    if (!HashImages.ContainsKey(s))
                    {
                        task = new Task(() => AddInHashImages(s));
                        task.Start();
                    }
                }
                f.Close();               
            }
            else
            {
                pictureBox.BackgroundImage = HashImages.First(el => el.Key == s).Value;
                Task task = null;
                if (listBox.SelectedIndex != 0)
                {
                    s = listBox.Items[listBox.SelectedIndex - 1].ToString();
                    if (!HashImages.ContainsKey(s))
                    {
                        task = new Task(() => AddInHashImages(s));
                        task.Start();
                    }
                    
                }
                if (listBox.SelectedIndex != listBox.Items.Count - 1)
                {
                    s = listBox.Items[listBox.SelectedIndex + 1].ToString();
                    if (!HashImages.ContainsKey(s))
                    {
                        task = new Task(() => AddInHashImages(s));
                        task.Start();
                    }
                }
            }
        }
 
        
    }
}
Миниатюры
При выборе следующего за выбранным файла сообщается, что он используется в другом процессе  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.12.2012, 18:40
Ответы с готовыми решениями:

Не запускается Apache, сообщается , что порт 80 используется и "Невозможно открыть процесс" с PID 4!
Доброго времени суток! Мой Apache, в локальном сервере XAMPP, не запускается на моей OS Windows 8.1 Софт сообщает, что Порт 80...

Через некоторое время при включении компа стало возникать сообщение,что этот номер аськи используется на другом компе
помогите решить проблему-) Год назад зарегистрировала почту Рамблер и на ней Аську 579201578 Через некоторое время при включении компа...

Ошибка при выборе раздела в процессе установки ОС
при установке виндовс в середине где диски выбирают диски вот так пишет и не хочет дальше идти &quot;незанятое место на диске 0 свободно...

13
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 52
05.12.2012, 20:46  [ТС]
C#
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
private void listBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            string s = listBox.SelectedItem.ToString();
            if (!HashImages.ContainsKey(s))
            {
                FileStream f = new FileStream(@s, FileMode.Open);
                Image img = new Bitmap(f);
                Task task = null;
                pictureBox.BackgroundImage = img;
                if (listBox.SelectedIndex != 0)
                {
                    s = listBox.Items[listBox.SelectedIndex - 1].ToString();
                    if (!HashImages.ContainsKey(s))
                    {
                        task = new Task(() => AddInHashImages(s));
                        task.Start();
                        task.Wait(100);
                    }
                }
                if (listBox.SelectedIndex != listBox.Items.Count - 1)
                {
                    s = listBox.Items[listBox.SelectedIndex + 1].ToString();
                    if (!HashImages.ContainsKey(s))
                    {
                        task = new Task(() => AddInHashImages(s));
                        task.Start();
                        task.Wait(100);
                    }
                }
                f.Close();               
            }
            else
            {
                pictureBox.BackgroundImage = HashImages.First(el => el.Key == s).Value;
                Task task = null;
                if (listBox.SelectedIndex != 0)
                {
                    s = listBox.Items[listBox.SelectedIndex - 1].ToString();
                    if (!HashImages.ContainsKey(s))
                    {
                        task = new Task(() => AddInHashImages(s));
                        task.Start();
                        task.Wait(100);
                    }
                    
                }
                if (listBox.SelectedIndex != listBox.Items.Count - 1)
                {
                    s = listBox.Items[listBox.SelectedIndex + 1].ToString();
                    if (!HashImages.ContainsKey(s))
                    {
                        task = new Task(() => AddInHashImages(s));
                        task.Start();
                        task.Wait(100);
                    }
                }
            }
        }
также стопорится только если быстро переключать...
0
Заблокирован
05.12.2012, 21:06
C#
1
2
3
4
5
6
7
8
9
 if (listBox.SelectedIndex != 0)   fileStream открыт с s
                {
                    s = listBox.Items[listBox.SelectedIndex - 1].ToString();
                    if (!HashImages.ContainsKey(s))
                    {
                        task = new Task(() => AddInHashImages(s)); а тут мы создаем таску и выполняем ее асинхронно
                        task.Start(); //в другом потоке -- падаем, т.к. fileStream уже открыт с s в другом потоке
                    }
                }
1
Заблокирован
05.12.2012, 22:28
ееннг

Добавлено через 1 час 21 минуту
глюканул сайт
1
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 52
05.12.2012, 23:15  [ТС]
adm_loro,
не поняла, тут же он закрывается...
C#
1
2
3
4
5
6
7
8
9
10
        private void AddInHashImages(string s)
        {
            if (!HashImages.ContainsKey(s))
            {
                FileStream f = new FileStream(@s, FileMode.Open);
                Image img = new Bitmap(f);
                HashImages.Add(s, img);
                f.Close();
            }
        }
Добавлено через 10 минут
просто если быстро переключаешь, он в словарик не успевает ещё занестись и получается ещё занят и в следствие заходит не в ту ветку...
0
Заблокирован
06.12.2012, 13:30
Если Вы хотите асинхронно добавлять/читать словарь используйте lock. volatile, кстати, вам точно не нужен.
Но зачем?
Вот это выполняется быстро и другой поток ну просто не нужен.
C#
1
2
3
4
5
6
7
8
9
10
  private void AddInHashImages(string s)
        {
            if (!HashImages.ContainsKey(s))
            {
                FileStream f = new FileStream(@s, FileMode.Open);
                Image img = new Bitmap(f);
                HashImages.Add(s, img);
                f.Close();
            }
        }
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 52
06.12.2012, 13:50  [ТС]
adm_loro, с другим потоком намного быстрее!
0
Заблокирован
06.12.2012, 13:54
да и неправильно
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 52
06.12.2012, 13:59  [ТС]
adm_loro, вот так очень даже правильно!)
C#
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading.Tasks;
using System.IO;
using System.Threading;
 
namespace WFAppImageCache
{
    public partial class FormImages : Form
    {
        public FormImages()
        {
            InitializeComponent();
        }
 
        Dictionary<string, Bitmap> HashImages = new Dictionary<string, Bitmap>();
        Task task = null;
 
        private void AddInHashImages(string s)
        {
            if (!HashImages.ContainsKey(s))
            {
                try
                {
                    FileStream f = new FileStream(@s, FileMode.Open);
                    Bitmap bmp = new Bitmap(f);
                    HashImages.Add(s, bmp);
                    f.Close();
                }
                catch (IOException)
                {
                    
                }
            }
        }
 
        private void TaskExec(string s)
        {
            if (HashImages.Count >= 2)
                HashImages.Clear();
            task = new Task(() => AddInHashImages(s));
            task.Start();
            task.Wait(10);
        }
 
        private void listBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            string s = listBox.SelectedItem.ToString();
            
            if (!HashImages.ContainsKey(s))
            {
                try
                {
                    FileStream f = new FileStream(@s, FileMode.Open);
                    Bitmap bmp = new Bitmap(f);
                    pictureBox.BackgroundImage = bmp;
                    f.Close();
                }
                catch (IOException)
                {
                    MessageBox.Show("Не спешите!");
                }
                if (listBox.SelectedIndex != 0)
                {
                    s = listBox.Items[listBox.SelectedIndex - 1].ToString();
                    if (!HashImages.ContainsKey(s))
                        TaskExec(s);
                }
                if (listBox.SelectedIndex != listBox.Items.Count - 1)
                {
                    s = listBox.Items[listBox.SelectedIndex + 1].ToString();
                    if (!HashImages.ContainsKey(s))
                        TaskExec(s);
                }
                              
            }
            else
            {
                pictureBox.BackgroundImage = HashImages.First(el => el.Key == s).Value;
                if (listBox.SelectedIndex != 0)
                {
                    s = listBox.Items[listBox.SelectedIndex - 1].ToString();
                    if (!HashImages.ContainsKey(s))
                        TaskExec(s);
                    
                }
                if (listBox.SelectedIndex != listBox.Items.Count - 1)
                {
                    s = listBox.Items[listBox.SelectedIndex + 1].ToString();
                    if (!HashImages.ContainsKey(s))
                        TaskExec(s);
                }
            }
        }
 
        
    }
}
0
Заблокирован
06.12.2012, 14:21
На 2-х процессорной машине упадет (у меня падает)
task.Wait(10); - это не верно.

Добавлено через 1 минуту
если так безумно хочется использовать Task, то сейчас скину код.
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 52
06.12.2012, 14:24  [ТС]
adm_loro, у меня на 2х ядерном ниче не падает)
0
Заблокирован
06.12.2012, 18:04
1. 2 ядра и 2 процессора - это разные вещи
2. FileStream f = new FileStream(@s, FileMode.Open) - следует использовать using, а то поток может так и не закрыться, если полетит Exeption;
3. Task task = null; абсолютно бесполезное объявление, т.к. Вы каждый раз создаете новый объект Task/
4. Планирование потоков занимается Windows и вмешаться в это нельзя, т.е. вот это HashImages.ContainsKey(s) может вернуть false, а в следующий момент Windows переключит контекст на другой поток, который сделай вот так: HashImages.Add(s, bmp), и снова переключение контекста и уже первый поток пытается вставить в словарь но уже существующее значение и летит Exeption. Самое страшное в этой ошибке, что она может у Вас не проявиться вообще никогда или очень редко, а на другой машине падать постоянно(как у меня например).
5. А вот это:
C#
1
2
3
4
5
6
7
8
9
10
11
12
   if (listBox.SelectedIndex != 0)
                {
                    s = listBox.Items[listBox.SelectedIndex - 1].ToString();
                    if (!HashImages.ContainsKey(s))
                        TaskExec(s);
                }
                if (listBox.SelectedIndex != listBox.Items.Count - 1)
                {
                    s = listBox.Items[listBox.SelectedIndex + 1].ToString();
                    if (!HashImages.ContainsKey(s))
                        TaskExec(s);
                }
вообще не понятно зачем.

Вот примерчик, его нужно совсем немного изменить и будет все работать.
C#
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
78
79
80
81
82
83
private readonly Dictionary<string, Bitmap> _hashImages = new Dictionary<string, Bitmap>();
        private readonly object _lock = new object();
 
        private volatile int _currentIndex;  //volatile нужен
        private void Start(string path, int index)
        {
            ThreadPool.QueueUserWorkItem(state => SetImageBox(path, index)); //Пул потоков, лучше чем Task, но это как хочешь
        }
 
        private void SetImageBox(string path, int index)
        {
            try
            {
                if (index != _currentIndex) //возможно текущий индекс уже изменился
                    return;
                var image = GetImage(path);
                    //получаем монопольно(все остальные потоки будут ждать) картинку, если надо кешируем
                //Thread.Sleep(300); //имитируем долгую загрузку
                if (index != _currentIndex) //возможно текущий индекс уже изменился
                    return;
                SafeSetImage(image);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private Bitmap GetImage(string path)
        {
            lock (_lock)
            {
                Bitmap image;
                if (TryGetValue(path, out image))
                {
                    return image;
                }
                image = LoadImage(path);
                AddImage(path, image);
                return image;
            }
        }
 
        private bool TryGetValue(string path, out Bitmap image)
        {
            return _hashImages.TryGetValue(path, out image);
        }
 
        private void AddImage(string path, Bitmap image)
        {
            _hashImages.Add(path, image);
        }
 
        private static Bitmap LoadImage(string path)
        {
            using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
               var bmp =  new Bitmap(fs);
                return bmp;
            }
        }
 
        private void SafeSetImage(Image bmp)
        {
            if(_pictureBox.InvokeRequired)
            {
                var d = new Action<Bitmap>(SafeSetImage);
                _pictureBox.Invoke(d, bmp);
            }
            else
            {
                _pictureBox.Image = bmp;
            }
        }
 
        private void listBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            _pictureBox.Image = Resources.wait_anim_new; //Тут я вставляю анимированную гифку, что мол загружается картинка
            var index = _listBox.SelectedIndex;
            _currentIndex = index;
            var s = _listBox.SelectedItem.ToString();
            Start(s, index); 
        }
0
0 / 0 / 0
Регистрация: 25.05.2012
Сообщений: 52
06.12.2012, 18:49  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
 
   if (listBox.SelectedIndex != 0)
                {
                    s = listBox.Items[listBox.SelectedIndex - 1].ToString();
                    if (!HashImages.ContainsKey(s))
                        TaskExec(s);
                }
                if (listBox.SelectedIndex != listBox.Items.Count - 1)
                {
                    s = listBox.Items[listBox.SelectedIndex + 1].ToString();
                    if (!HashImages.ContainsKey(s))
                        TaskExec(s);
                }
это для первого и последнего ибо у одного нет предыдущего элемента, а у другого следующего.

Добавлено через 12 минут
adm_loro,
C#
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
78
79
80
81
82
83
private readonly Dictionary<string, Bitmap> _hashImages = new Dictionary<string, Bitmap>();
        private readonly object _lock = new object();
 
        private volatile int _currentIndex;  //volatile нужен
        private void Start(string path, int index)
        {
            ThreadPool.QueueUserWorkItem(state => SetImageBox(path, index)); //Пул потоков, лучше чем Task, но это как хочешь
        }
 
        private void SetImageBox(string path, int index)
        {
            try
            {
                if (index != _currentIndex) //возможно текущий индекс уже изменился
                    return;
                var image = GetImage(path);
                    //получаем монопольно(все остальные потоки будут ждать) картинку, если надо кешируем
                //Thread.Sleep(300); //имитируем долгую загрузку
                if (index != _currentIndex) //возможно текущий индекс уже изменился
                    return;
                SafeSetImage(image);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
 
        private Bitmap GetImage(string path)
        {
            lock (_lock)
            {
                Bitmap image;
                if (TryGetValue(path, out image))
                {
                    return image;
                }
                image = LoadImage(path);
                AddImage(path, image);
                return image;
            }
        }
 
        private bool TryGetValue(string path, out Bitmap image)
        {
            return _hashImages.TryGetValue(path, out image);
        }
 
        private void AddImage(string path, Bitmap image)
        {
            _hashImages.Add(path, image);
        }
 
        private static Bitmap LoadImage(string path)
        {
            using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
               var bmp =  new Bitmap(fs);
                return bmp;
            }
        }
 
        private void SafeSetImage(Image bmp)
        {
            if(_pictureBox.InvokeRequired)
            {
                var d = new Action<Bitmap>(SafeSetImage);
                _pictureBox.Invoke(d, bmp);
            }
            else
            {
                _pictureBox.Image = bmp;
            }
        }
 
        private void listBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            _pictureBox.Image = Resources.wait_anim_new; //Тут я вставляю анимированную гифку, что мол загружается картинка
            var index = _listBox.SelectedIndex;
            _currentIndex = index;
            var s = _listBox.SelectedItem.ToString();
            Start(s, index); 
        }
и это всё может и правильно и хорошо, но все файлы грузятся одинаково медленно а следующий и предыдущий за выбранным должны быстрее, так как они во время загрузки выбранного должны уже были загрузиться тоже а тут быстро начинают грузиться ток те файлы которые открываем второй раз.
0
Заблокирован
06.12.2012, 19:04
А что тогда Вам мешает заполнять кэш сразу в другом потоке?

Добавлено через 4 минуты
ListBox с рандомным доступом к элементам и Ваша оптимизация ну просто нафиг не нужна. Либо кешируем в другом потоке, либо кешируем линиво, как в мое примере. Иначе - это не имеет смысла.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.12.2012, 19:04
Помогаю со студенческими работами здесь

При десериализации сообщается, что ожидался объект ArrayOfMyObject, а принимается MyObjects
при запросе с вебсервиса приходит ответ в виде: &lt;MyObjects&gt; &lt;MyObject&gt; &lt;id&gt;1&lt;/id&gt; &lt;name&gt;test&lt;/name&gt; ...

При компиляции сообщается, что в декларации два или больше типов
Создал библиотеку с функцией считывающей из файла данные в структуру. Первая ошибка в заголовке функции: void Config_Read (FILE *fin,...

При повторной попытке подключиться к базе сообщается, что файл уже занят
добрый день, я подключаю базу данных к проекту, получаю данные из базы, заношу их в DataSet, закрываю соединение с базой. При повторной...

При попытке открыть форму в конструкторе, сообщается, что не найден setting.xml
Есть проект, он работает(перестраивается и запускается, согласно последним обновления логики), НО когда я пытаюсь открыть форму в...

Работа с MySQL. При попытке зашифровать данные сообщается, что файл не найден
Всем привет, хотел бы услышать возможный ответ на проблему Есть программка весит 400кб использует библиотеки для подключения к базе sql ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru