Я написал программу на C# Windows Forms для сохранения файлов в MATLAB.
Функция сохранения данных в MATLAB выполняется слишком долго, поэтому я решил использовать индикаторы выполнения для отображения пользователь, сколько времени потребуется для завершения процесса.
Я прилагаю свой код. В некоторых случаях он работает нормально, но в некоторых других случаях я получаю сообщение об ошибке:
System.IndexOutOfRangeException: 'Вероятное состояние гонки ввода-вывода обнаружено при копировании памяти. Пакет ввода-вывода по умолчанию не является потокобезопасным. В многопоточных приложениях доступ к потоку должен осуществляться потокобезопасным способом, например, с помощью потокобезопасной оболочки, возвращаемой методами TextReader или TextWriter Synchronized. Это также относится к таким классам, как StreamWriter и StreamReader.'
Я хочу, чтобы основная функция находилась в основном потоке, а индикатор выполнения обновлялся в другом потоке. , и, конечно, я хочу, чтобы файлы сохранялись один за другим, а заполнение индикатора выполнения происходило один за другим.
Действительно, я хочу избежать многопоточности, поскольку вся программа написана в одном потоке таким образом, просто создайте еще один поток для обновления каждого прогресса стоимость бара. Ниже мой код. Я рад вашей огромной помощи.
public class SaveToMatlab
{
ProgressBar progressBar = new ProgressBar();
private void BtnSaveToMatlab_Click(object sender, EventArgs e)
{
ResetProgressBars();
if (!backgroundWorker.IsBusy)
{
backgroundWorker.RunWorkerAsync();
}
}
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < tableLayoutPanel.Controls.Count; i++)
{
var flp = tableLayoutPanel.Controls as FlowLayoutPanel;
if (flp != null && flp.Controls.OfType().Any(x => x.Checked))
{
progressBar = flp.Controls.OfType().FirstOrDefault();
if (progressBar != null)
{
var directory = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "MatlabOutput");
fileList.SaveLogToMatWorkSpace(Path.Combine(directory, $"matlab_{fileList.GetIdentifier()}.mat"), backgroundWorker);
}
}
}
}
private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = progressBar.Value + e.ProgressPercentage > 100 ? 100 : progressBar.Value + e.ProgressPercentage;
}
private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("Operation was canceled.");
}
else if (e.Error != null)
{
MessageBox.Show("An error occurred: " + e.Error.Message);
}
else
{
MessageBox.Show("Operation completed successfully.");
}
}
}
public class OtherClass
{
public void SaveLogToMatWorkSpace(string fileName, BackgroundWorker worker)
{
if (indices.Count > 0)
{
double increment = 100 / (double)(indices.Count - 1);
for (int i = 0; i < indices.Count; i++)
{
if (indices.Count > 0)
{
//... My code to save in MATLAB...
}
int progress = (int)Math.Ceiling(increment);
worker.ReportProgress(progress);
}
new MatFileWriter(fileName, mlList, true);
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... ent-thread
Обновление индикатора выполнения в другом потоке ⇐ C#
Место общения программистов C#
-
Anonymous
1731628271
Anonymous
Я написал программу на C# Windows Forms для сохранения файлов в MATLAB.
Функция сохранения данных в MATLAB выполняется слишком долго, поэтому я решил использовать индикаторы выполнения для отображения пользователь, сколько времени потребуется для завершения процесса.
Я прилагаю свой код. В некоторых случаях он работает нормально, но в некоторых других случаях я получаю сообщение об ошибке:
System.IndexOutOfRangeException: 'Вероятное состояние гонки ввода-вывода обнаружено при копировании памяти. Пакет ввода-вывода по умолчанию не является потокобезопасным. В многопоточных приложениях доступ к потоку должен осуществляться потокобезопасным способом, например, с помощью потокобезопасной оболочки, возвращаемой методами TextReader или TextWriter Synchronized. Это также относится к таким классам, как StreamWriter и StreamReader.'
Я хочу, чтобы основная функция находилась в основном потоке, а индикатор выполнения обновлялся в другом потоке. , и, конечно, я хочу, чтобы файлы сохранялись один за другим, а заполнение индикатора выполнения происходило один за другим.
Действительно, я хочу избежать многопоточности, поскольку вся программа написана в одном потоке таким образом, просто создайте еще один поток для обновления каждого прогресса стоимость бара. Ниже мой код. Я рад вашей огромной помощи.
public class SaveToMatlab
{
ProgressBar progressBar = new ProgressBar();
private void BtnSaveToMatlab_Click(object sender, EventArgs e)
{
ResetProgressBars();
if (!backgroundWorker.IsBusy)
{
backgroundWorker.RunWorkerAsync();
}
}
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < tableLayoutPanel.Controls.Count; i++)
{
var flp = tableLayoutPanel.Controls[i] as FlowLayoutPanel;
if (flp != null && flp.Controls.OfType().Any(x => x.Checked))
{
progressBar = flp.Controls.OfType().FirstOrDefault();
if (progressBar != null)
{
var directory = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "MatlabOutput");
fileList[i].SaveLogToMatWorkSpace(Path.Combine(directory, $"matlab_{fileList[i].GetIdentifier()}.mat"), backgroundWorker);
}
}
}
}
private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = progressBar.Value + e.ProgressPercentage > 100 ? 100 : progressBar.Value + e.ProgressPercentage;
}
private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
MessageBox.Show("Operation was canceled.");
}
else if (e.Error != null)
{
MessageBox.Show("An error occurred: " + e.Error.Message);
}
else
{
MessageBox.Show("Operation completed successfully.");
}
}
}
public class OtherClass
{
public void SaveLogToMatWorkSpace(string fileName, BackgroundWorker worker)
{
if (indices.Count > 0)
{
double increment = 100 / (double)(indices.Count - 1);
for (int i = 0; i < indices.Count; i++)
{
if (indices[i].Count > 0)
{
//... My code to save in MATLAB...
}
int progress = (int)Math.Ceiling(increment);
worker.ReportProgress(progress);
}
new MatFileWriter(fileName, mlList, true);
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79189145/progress-bar-updating-on-different-thread[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия