gpt4 book ai didi

c# - 从外部类更新主窗体的进度条?

转载 作者:行者123 更新时间:2023-12-02 05:05:39 26 4
gpt4 key购买 nike

我有一个带有进度条的主窗体,我想从名为“Logic”的外部类更新进度条...但是,主窗体上已经引用了 Logic。如果我尝试引用逻辑中的主窗体来更新进度条,我只会得到堆栈溢出。

在四处搜索时,我遇到了很多关于 BackgroundWorker 的主题......但这不是我想要使用的。我的 Logic 类中有特定位置,我想在其中使用 progressbar.PerformStep() 更新主窗体上的进度条。我已经尝试在主窗体上创建一个方法来更新进度条并从 Logic 类调用它,但是它又一次缺少引用......我不能只使用 MainForm frm1 = new MainForm() 而不会导致其他地方的错误。我在这里感到很困惑。

[编辑]

这是解决方案的代码(感谢你们)----

主窗体:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Natural_Language_Processor
{
public partial class frm_Main : Form

{
Logic logic = new Logic();

public frm_Main()
{
InitializeComponent();
}

private void frm_Main_Load(object sender, EventArgs e)
{
Timer.Start();
}

private void btn_Enter_Click(object sender, EventArgs e)
{
logic.Progress += new Logic.ProgressDelegate(DisplayProgess);
logic.RaiseProgress(0);

logic.str_Input = txt_Input.Text;
logic.Prep_Input();

txt_Input.Text = "";
logic.RaiseProgress(100);
System.Threading.Thread.Sleep(100);
logic.RaiseProgress(0);
}

private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}

private void eraseToolStripMenuItem_Click(object sender, EventArgs e)
{
logic.EraseMemory();
}

public void DisplayProgess(int percent)
{
if (this.InvokeRequired)
{
this.Invoke(new Logic.ProgressDelegate(DisplayProgess), new Object[] { percent });
}
else
{
this.progbar.Value = percent;
}
}
}

逻辑:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace Natural_Language_Processor
{
class Logic
{
Data oData = new Data();
public List<string> Words = new List<string>();

private System.Threading.Thread T = null;

public delegate void ProgressDelegate(int percent);
public event ProgressDelegate Progress;

#region Variables
public string str_Input;
public string[] WordArray;
#endregion

public void RaiseProgress(int percent)
{
if (Progress != null)
{
Progress(percent);
}
}

public void Prep_Input()
{
//Check for Input
if (String.IsNullOrEmpty(str_Input))
{

}
else
{
//Set everything to lower-case
str_Input = str_Input.ToLower();
RaiseProgress(10);

//Remove all punctuation
if (str_Input.Contains(","))
{
while (str_Input.Contains(","))
{
int int_index = str_Input.IndexOf(",");
str_Input = str_Input.Remove(int_index, 1);
}
}
if (str_Input.EndsWith("."))
{
str_Input = str_Input.Trim('.');
}
else if (str_Input.EndsWith("?"))
{
str_Input = str_Input.Trim('?');
}
RaiseProgress(20);

//Split the sentence into an array of individual words
WordArray = str_Input.Split(' ');
RaiseProgress(30);

//Get current words (and max ID) from the database
int max_index = 0;
oData.GetWords();
Words.Clear();

if (oData.WordDataSet.Count > 0)
{
for (int i = 0; i < oData.WordDataSet.Count; i++)
{
max_index = oData.WordDataSet[i].ID;
Words.Add(oData.WordDataSet[i].Word);
}
}
RaiseProgress(40);

//Check each word in the sentence
for (int i = 0; i < WordArray.Length; i++)
{
//Update the frequency of an existing word in the database
if (Words.Contains(WordArray[i].ToString()))
{
oData.UpdateWords(WordArray[i].ToString());
}
else
{
//Or add the word
max_index = max_index + 1;
oData.InsertWordsTable(max_index, WordArray[i].ToString(), 1);

//And create its pre/pro word tables
oData.NewPreWordTable(WordArray[i].ToString());
oData.NewProWordTable(WordArray[i].ToString());
}
}
RaiseProgress(50);

//Check each word in the sentence after we have possibly created new pre/pro word tables in the previous code
for (int i = 1; i < WordArray.Length; i++)
{
oData.GetPreWords(WordArray[i].ToString());
Words.Clear();

//Get current pre_words from the database
for (int a = 0; a < oData.WordDataSet.Count; a++)
{
Words.Add(oData.WordDataSet[a].Word);
}

//Update the frequency of an existing word in the database
if (Words.Contains(WordArray[i - 1].ToString()))
{
oData.UpdatePreWords(WordArray[i].ToString(), WordArray[i - 1].ToString());
}
else
{
//Or add the word
oData.InsertPreWord(WordArray[i].ToString(), oData.GetPreWordIndex(WordArray[i].ToString()), WordArray[i - 1].ToString(), 1);
}

if (i == WordArray.Length - 1)
{

}
else
{
oData.GetProWords(WordArray[i].ToString());
Words.Clear();

//Get current pro_words from the database
for (int b = 0; b < oData.WordDataSet.Count; b++)
{
Words.Add(oData.WordDataSet[b].Word);
}

//Update the frequency of an existing word in the database
if (Words.Contains(WordArray[i + 1].ToString()))
{
oData.UpdateProWords(WordArray[i].ToString(), WordArray[i + 1].ToString());
}
else
{
//Or add the word
oData.InsertProWord(WordArray[i].ToString(), oData.GetProWordIndex(WordArray[i].ToString()), WordArray[i + 1].ToString(), 1);
}
}
}
RaiseProgress(60);
}
}

public void Respond()
{
RaiseProgress(70);
}

public void EraseMemory()
{
oData.GetWords();
Words.Clear();
for (int i = 0; i < oData.WordDataSet.Count; i++)
{
oData.DeletePreTable(oData.WordDataSet[i].Word);
oData.DeleteProTable(oData.WordDataSet[i].Word);
}
oData.DeleteWordsTable();
MessageBox.Show("Memory has been erased.");
}
}

最佳答案

这是一种松散耦合的方法,Logic() 类引发自定义事件而不是直接引用 Form:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Logic logic = new Logic();
logic.Progress += new Logic.ProgressDelegate(DisplayProgess);
logic.Start();
}

public void DisplayProgess(string message, int percent)
{
if (this.InvokeRequired)
{
this.Invoke(new Logic.ProgressDelegate(DisplayProgess), new Object[] { message, percent });
}
else
{
this.label1.Text = message;
this.progressBar1.Value = percent;
}
}

}

public class Logic
{

private System.Threading.Thread T = null;

public delegate void ProgressDelegate(string message, int percent);
public event ProgressDelegate Progress;

public void Start()
{
if (T == null)
{
T = new System.Threading.Thread(new System.Threading.ThreadStart(Worker));
T.Start();
}
}

private void Worker()
{
RaiseProgress("Initializing...", 0);
System.Threading.Thread.Sleep(1000); // simulated work

RaiseProgress("Loading Map...", 25);
System.Threading.Thread.Sleep(1500); // simulated work

RaiseProgress("Loading Sprites...", 50);
System.Threading.Thread.Sleep(1200); // simulated work

RaiseProgress("Loading Sound Effects...", 75);
System.Threading.Thread.Sleep(1700);

RaiseProgress("Loading Music...", 85);
System.Threading.Thread.Sleep(1100); // simulated work

RaiseProgress("Done!", 100);
}

private void RaiseProgress(string message, int percent)
{
if (Progress != null)
{
Progress(message, percent);
}
}

}

关于c# - 从外部类更新主窗体的进度条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16311272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com