Обновление индикатора выполнения в другом потокеC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Обновление индикатора выполнения в другом потоке

Сообщение Anonymous »

Я написал программу на C# Windows Forms для сохранения файлов в MATLAB. Функция сохранения данных в MATLAB выполняется слишком долго, поэтому я решил использовать индикаторы выполнения, чтобы показать пользователю, сколько времени потребуется для завершения процесса. Прикрепляю свой код. В некоторых случаях он работает нормально, но выдает ошибку
"System.IndexOutOfRangeException: 'Вероятное состояние гонки ввода-вывода обнаружено при копировании памяти. Пакет ввода-вывода не является потокобезопасным с помощью default. В многопоточных приложениях доступ к потоку должен осуществляться потокобезопасным способом, например, через потокобезопасную оболочку, возвращаемую методами 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)
{
if (indices.Count > 0)
{
двойное приращение = 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);
}
}
}
`

Подробнее здесь: https://stackoverflow.com/questions/791 ... ent-thread
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Обновление индикатора выполнения в другом потоке
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Обновление индикатора выполнения в другом потоке
    Anonymous » » в форуме C#
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Winforms: обновление индикатора выполнения в форме из расчета на уровне доступа к данным
    Anonymous » » в форуме C#
    0 Ответы
    37 Просмотры
    Последнее сообщение Anonymous
  • Обновление индикатора выполнения с использованием процента прогресса, отправленного процессом cmd
    Anonymous » » в форуме C#
    0 Ответы
    63 Просмотры
    Последнее сообщение Anonymous
  • Обновление индикатора выполнения формы из другого класса
    Гость » » в форуме C#
    0 Ответы
    19 Просмотры
    Последнее сообщение Гость

Вернуться в «C#»