PDA

View Full Version : سوال: مشکل thread با openfiledialog



m.bibjan
پنج شنبه 24 فروردین 1391, 13:28 عصر
سلام قبل از استفاده از ترید توی برنامه OpenFileDialog مشکلی نداشت ولی واسه انتقال از یک فرم به فرم بعدیم از ترید استفاده کردم حالا گیر داده و این ارور رو میده

Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it. This exception is only raised if a debugger is attached to the process.

اینم کدم واسه انتقال از یک فرم به فرم بعدیم

frmshowinfo showinfo = new frmshowinfo();
Thread frmshowinfo = new Thread(delegate() { Runfrmshowinfo(new frmshowinfo()); });
frmshowinfo.Start();
this.Close();
حالا نمیدونم چیکار کنم لطفا راهنمایی بفرمایید؟

cpppro
پنج شنبه 24 فروردین 1391, 13:47 عصر
سلام
ای کاش برنامه رو کامل تر میزاشتین.چون این طوری نمیشه اظهار نظر کرد.ممکنه پارامترها رو رعایت نکرده باشین.غیر از اون چون برنامه شما win form هست کدهایی که برای ایجاد ترد تو کنسول مینوشتین اینجا باید کمی توشون تغییر ایجاد کنین.

m.bibjan
پنج شنبه 24 فروردین 1391, 13:55 عصر
سلام
اینم کدمه توی انتخاب عکس
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "jpgfile (*.jpg)|*.jpg";
if (ofd.ShowDialog() == DialogResult.OK)
{
txtimage.Text = ofd.FileName;
picbox1.LoadAsync(ofd.FileName);
}

بگین کدهای کدوم قسمت رو بذارم اینجا؟
بیشتر توضیح میدین؟

mmd2009
پنج شنبه 24 فروردین 1391, 15:03 عصر
با سلام

کافیه قبل از استارت کردن نخ برنامتون ApartmentState رو ست بکنید با STA به این شکل :


frmshowinfo showinfo = new frmshowinfo();
Thread frmshowinfo = new Thread(delegate() { Runfrmshowinfo(new frmshowinfo()); });
frmshowinfo.SetApartmentState(ApartmentState.STA);
frmshowinfo.Start();
this.Close();


برای اطلاعات بیشتر به اینجا (http://msdn.microsoft.com/en-us/library/system.stathreadattribute.aspx)مراجعه کنید

موفق باشید

cpppro
پنج شنبه 24 فروردین 1391, 15:07 عصر
سلام

الان کار کرد و خطا نداد.ولی مشکلی که هست اینکه چون فرم جدید با یک ترد مجزا ساخته میشه بعد از اتمام کار همون ترد فرم هم بسته میشه.بهتره اجرای فرم رو از داخل ترد بیرون بیارین.
البته با این کار مشکل همزمانی ارسال باید درست شه.یعنی ممکنه اول عکس فرستاده شه بعدا فرم باز بشه یا برعکس.
یکم روش کار کنین یا از قفل ها استفاده کنین احتمالا حل میشه.
private void button5_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "jpgfile (*.jpg)|*.jpg";
if (ofd.ShowDialog() == DialogResult.OK)
{
// txtimage.Text = ofd.FileName;
pictureBox1.LoadAsync(ofd.FileName);
}

Form2 showinfo = new Form2();
Thread frmshowinfo = new Thread(delegate() { Runfrmshowinfo(showinfo); });
//Thread frmshowinfo = new Thread(delegate() { Runfrmshowinfo(new Form2()); });
frmshowinfo.Start();
// this.Close()
Thread.Sleep(2000);


}
public void Runfrmshowinfo(Form2 objform)
{
objform.Show();
}

m.bibjan
پنج شنبه 24 فروردین 1391, 15:21 عصر
ممنون
پس اگر خواستیم استفاده کنیم هم از ترد و هم از اوپن فایل دیالوگ باید این ست رو انجامش بدیم؟

hakim22
پنج شنبه 24 فروردین 1391, 16:30 عصر
thread ها یکم کار رو پیچیده می کنند.
خیلی وقتها میشه از |backgroundWorker استفاده کنید.