שגיאת thread ב-WPF - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

שגיאת thread ב-WPF


moskitos

Recommended Posts

יש לי תוכנת WPF שמריצה קבצים ואני משתמש ב-BackgroundWorker, לאחר שכל הקבצים מסתיימים אני רוצה להציג בלייבל מסויים שזה סיים ולכן ממש בסוף הלולאה של ההרצה אחרי שהכל מסתיים עידכנתי את הלייבל אבל אני מקבל את השגיאה הבאה:

The calling thread cannot access this object because a different thread owns it

ניסיתי גם ליצור THREAD נפרד שקורה לפונקציה פשוטה שהיא מעדכנת את הלייבל אבל אני מקבל את אותה השגיאה, איך אפשר להתגבר על זה ?

קישור לתוכן
שתף באתרים אחרים

תוצאה ראשונה בגוגל:

http://www.switchonthecode.com/tutorials/working-with-the-wpf-dispatcher

במשפט אחד - יש רק ת'רד אחד באפליקציה שיכול לעשות שינויים ב-UI. אם ת'רד אחר רוצה לעדכן את ה-UI, אז הוא צריך לשלוח הודעה לאובייקט מיוחד (Dispatcher) שדואג להפעיל את הפונקציה מתוך הת'רד הנכון.

קישור לתוכן
שתף באתרים אחרים

תודה רבה.

ניסיתי את זה עכשיו וזה עובד אבל יש לךי בעיה אחרת, כאמור יש לי Listbox שאליה אני מכניס קבצים מסויימים, אם הקובץ הוא לא AVI אני ממיר אותו אוטומטי בעזרה תוכנה מסויימת אבל אממה, אני רוצה שאם אני מכניס קבצים שהם לא AVI אז בזמן שהתוכנה ממירה אותם אז יכתב לי בלייבל מסויים שהם כרגע מומרים לפורמט אחר, מה שקורה לי כרגע זה רק כאשר התוכנה סיימה להמיר אותם היא רושמת את זה למרות שאני מכניס את ה-thread (מהלינק שנתת לי) במקום הנכון:


Stream checkStream = null;
.Win32.OpenFileDialog openFileDialog = new .Win32.OpenFileDialog();
openFileDialog.Multiselect = true;
openFileDialog.InitialDirectory = "c:\\";
openFileDialog.Filter = "All files (*.*)|*.*";
openFileDialog.FilterIndex = 1;
openFileDialog.Title = "Please Select Source File";


if ((bool)openFileDialog.ShowDialog())
{
if ((checkStream = openFileDialog.OpenFile()) != null)
{
foreach (string file in openFileDialog.FileNames)
{
try
{
FileInfo fileInfo = new FileInfo(file);
listBoxFiles.Items.Add(file);
}
catch (Exception ex)
{
MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
}
}


for (int i = 0; i < listBoxFiles.Items.Count; i++)
{
string path = (string)listBoxFiles.Items[i];
FileInfo fileInfo = new FileInfo(path);


if (fileInfo.Extension != ".AVI")
{
listToRemove.Add(path);
}
}


foreach (string file in listToRemove)
{
//System.Threading.Thread thread = new System.Threading.Thread(
// new System.Threading.ThreadStart(
// delegate()
// {
// lblStatus2.Dispatcher.Invoke(
// System.Windows.Threading.DispatcherPriority.Norma l,
// new Action(
// delegate()
// {
// lblStatus2.Content = "Convert file to .AVI...";
// }
// ));
// }
//));


//thread.Start();


FileInfo fileInfo = new FileInfo(file);
editpcap = new (classes who convert the files)(fileInfo);
listBoxFiles.Items.Add(editpcap._newFileName);
}


foreach (string file in listToRemove) //remove all non .avi files from listbox
{
listBoxFiles.Items.Remove(file);
}
}
}
else
{


}

אגב סימנתי בהערה את ה-Thread שמעדכן את הלייבל (רק בשביל שיהיה קל לזהות אותו)

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...