誰もがこのコードで間違っていることを誰かに教えてもらえますか?Cでスレッドセーフのプログレスバーを作る方法は?私は間違って何をしていますか?
それは
_DialogueThread.Start();
に、「クロススレッド操作ではない有効な」例外がスローされますが、私は
_progressDialogue = new Progresser{Owner = _owner, StartPosition = FormStartPosition.CenterParent};
から「所有者」を削除した場合、例外がスローされ文句を言わないが、progressDialougeが表示されますすぐに隠された。
私はprogressDialouge.Ownerを別のスレッドで作成された親フォームに設定すると、なぜこのエラーがスローされるのか理解しています。しかし、なぜ私はしないときにフォームが消える?私は間違って何をしていますか?
おかげで、あなたのアクション(ボタンのクリック)で
class Sampleer : BackgroundWorker
{
private Progresser _progressDialogue;
private Thread _DialogueThread;
private Form _owner;
private bool _SampleSuccess;
public Sampleer(Form owner)
{
_owner = owner;
_progressDialogue = new Progresser{Owner = _owner, StartPosition = FormStartPosition.CenterParent};
_progressDialogue.Closed += ProgressDialogueClosed;
WorkerReportsProgress = true;
WorkerSupportsCancellation = true;
DoWork += Sampleer_DoWork;
RunWorkerCompleted += Sampleer_RunWorkerCompleted;
ProgressChanged += Sampleer_ProgressChanged;
}
private void Sampleer_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//UPDATE STATUS CODE IS HERE
}
void ProgressDialogueClosed(object sender, EventArgs e)
{
CancelAsync();
Dispose();
}
void Sampleer_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//FINISH PROCESS
}
void Sampleer_DoWork(object sender, DoWorkEventArgs e)
{
_DialogueThread = new Thread(_progressDialogue.Show);
_DialogueThread.Start();
//DO LONG PROCESS HERE
}
}
この場合、なぜBackgroundWorkerを継承していますか? – Pierreten
私はSampleerBackgroundWorkerを作成していますが、作業中は進行状況バーで新しいフォームをポップします – Amir
メインのUIスレッドから作業をオフロードするためにバックグラウンドワーカーを作成します。あなたは、この非UIスレッドでUI要素を作成するべきではありません。 – djeeg