martins
Goto Top

DotNET Csharp Frage zu ThreadPool mit Callback-delegate

Ich habe jetzt schon viele Stellen im Netz über Threading gefunden, aber keine hat mir bisher weiter geholfen.
Entweder alle Images werden erst am Ende angezeigt oder es kommt zum Programmhänger.

Übrigens funktioniert der Code ohne Callback/delegate unter Win7 mit 2 Prozessoren, aber nicht unter XP.

Dieser Code stellt mit Icons den Fortschritt aus einer Bearbeitungsliste dar.
Die Bearbeitung wird mit btnApply eingeleitet. Am Ende der Bearbeitung wird der Text des Buttons geändert.

		ManualResetEvent wait;

		private void btnApply_Click(object sender, EventArgs e)
		{
			wait = new ManualResetEvent[1];
			wait = new ManualResetEvent(false);
			ThreadPool.QueueUserWorkItem(new WaitCallback(doApply), 0);
			WaitHandle.WaitAny(wait);
			btnApply.Text = "Done!";  
		}

		private void doApply(object dummy)
		{
			for (int i = 0; i < 14; i++)
			{
				setPic(i, bmTODO);
			}
			// do something
			for (int i = 0; i < 14; i++)
			{
				setPic(i, bmWORK);
				// do something
				setPic(i, bmOK);
			}
		}

		public void setPic(int i, Image img)
		{
			switch (i)
			{
				case 0: pictureBox1.Image = img; break;
				case 1: pictureBox2.Image = img; break;
				case 2: pictureBox3.Image = img; break;
				case 3: pictureBox4.Image = img; break;
				case 4: pictureBox5.Image = img; break;
				case 5: pictureBox6.Image = img; break;
				case 6: pictureBox7.Image = img; break;
				case 7: pictureBox8.Image = img; break;
				case 8: pictureBox9.Image = img; break;
				case 9: pictureBox10.Image = img; break;
				case 10: pictureBox11.Image = img; break;
				case 11: pictureBox12.Image = img; break;
				case 12: pictureBox13.Image = img; break;
				case 13: pictureBox14.Image = img; break;
				default: break;
			}
		}
Ich habe es auch mit einem Delegaten versucht:
		public delegate void setPicDelegate(int i, Image img);
Das hat mich der Lösung aber nicht weiter gebracht.

Gibt es da eine einfache Lösung?
Oder muss ich jede einzelne PictureBox im doApply einzeln deligieren? - Was ich ja gerade vermeiden möchte!

Content-Key: 197512

Url: https://administrator.de/contentid/197512

Printed on: April 20, 2024 at 16:04 o'clock

Member: MartinS
MartinS Jan 29, 2013 at 11:17:39 (UTC)
Goto Top
Das Problem habe ich jetzt gelöst.
Statt TreadPool/WaitCallback setze ich jetzt den Backgroundworker ein:

BackgroundWorker worker;

private void btnApply_Click(object sender, EventArgs e)
{
    worker = new BackgroundWorker();
    worker.WorkerSupportsCancellation = true;

    worker.DoWork += new DoWorkEventHandler(doApply);
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(doApply_RunWorkerCompleted);
    worker.RunWorkerAsync();
}

private void doApply(object dummy) 
{ 
    for (int i = 0; i < 14; i++) 
    { 
        setPic(i, bmTODO); 
    } 
    // do something 
    for (int i = 0; i < 14; i++) 
    { 
        setPic(i, bmWORK); 
        // do something 
        setPic(i, bmOK); 
    } 
    worker.CancelAsync();
}

void doApply_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    btnApply.Text = "Done!";  
}