PDA

View Full Version : سوال: مولتی تردینگ (بخش کوچک)



cmsdqq2
پنج شنبه 19 آذر 1394, 23:51 عصر
سلام، بنده به WPF اومدم و یک فرمی با کاربردی مثل Splash Screen طراحی کردم، حالا تو قسمت Invoke اش موندم. قریب به یک ماهِ هر چی گشتم پیدا نکردم و جوابی نگرفتم. کسی میتونه کمک کنه؟

137387

parsdarab
پنج شنبه 19 آذر 1394, 23:59 عصر
باید از کد زیر استفاده کنی


System.Threading.Thread.CurrentThread.ApartmentSta te = System.Threading.ApartmentState.Unknown;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Forms.FrmLogo Frm_t;
Thread t_Show_Form = new Thread(delegate()
{
Frm_t = new Forms.FrmLogo();
Frm_t.ShowDialog();
});


t_Show_Form.Start();


//عملیات محاسباتی

t_Show_Form.Abort();


Forms.FrmLogin f = new Forms.FrmLogin();
if (f.ShowDialog() == DialogResult.OK)
{
Application.Run(new FrmMain());
}

cmsdqq2
جمعه 20 آذر 1394, 00:11 صبح
ممنون از پاسختون




کل کدها به این صورته:














private static Thread _LoadingScreenThread;
private static frmPleasewait _ls;
private static bool _shown = false;





public static void ShowLoadingScreen()
{

if (_LoadingScreenThread == null)
{
_LoadingScreenThread = new Thread(new ThreadStart(DoShowLoadingScreen));
_LoadingScreenThread.SetApartmentState(ApartmentSt ate.STA);
_LoadingScreenThread.IsBackground = true;
_LoadingScreenThread.Start();
}
}








private static frmPleasewait _ls;
public static void CloseLoadingScreen()
{
System.Threading.Thread.Sleep(250);
if (_ls != null && _ls.InvokeRequired = null)
{
_ls.Invoke(new MethodInvoker(CloseLoadingScreen));


}
else
{
if (_shown)
{
_shown = false;
Application.ExitThread();
}
if (_LoadingScreenThread != null) _LoadingScreenThread.Interrupt();




try
{
_ls.Close();
_ls.Dispose();




}
catch
{




}




_LoadingScreenThread = null;
}
}











private static void DoShowLoadingScreen()
{
_ls = new frmPleasewait();
_ls.pictureBox1.Enabled = true;
_ls.ShowDialog();
}




private void frmPleasewait_Load(object sender, EventArgs e)
{
this.Activate();
}




}





































فقط همون بخش رو تغییر بدم کافیه؟

cmsdqq2
جمعه 20 آذر 1394, 00:15 صبح
در واقع یک برنامه هست که اطلاعات رو در بانک ذخیره میکنه. (یک برنامه خیلی ساده اس دیگه)

حالا اگر تعداد داده ها زیاد باشه، بیشتر طول میکشه تا داده جدید ذخیره بشه. من یک فرم ساختم برای نشون داده منتظر بمانید، فقط حالا میخوام زمان بسته شدن فرم به اندازه مدت زمانی باشه که پردازش طول میکشه و انجام میشه، نه اینکه تایمر بذارم و ...

parsdarab
جمعه 20 آذر 1394, 00:17 صبح
اره اول با نخ فرمو نمایش میدی بعد از اتمام عملیات نخ رو نابود می کنی

این کد باید در ابتدا نوشته بشه توی wpf نمی دونم اما windows application در قسمت main نوشته میشه

cmsdqq2
جمعه 20 آذر 1394, 00:20 صبح
باید از کد زیر استفاده کنی


System.Threading.Thread.CurrentThread.ApartmentSta te = System.Threading.ApartmentState.Unknown;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Forms.FrmLogo Frm_t;
Thread t_Show_Form = new Thread(delegate()
{
Frm_t = new Forms.FrmLogo();
Frm_t.ShowDialog();
});


t_Show_Form.Start();


//عملیات محاسباتی

t_Show_Form.Abort();


Forms.FrmLogin f = new Forms.FrmLogin();
if (f.ShowDialog() == DialogResult.OK)
{
Application.Run(new FrmMain());
}




این ساختار برای WPF کار نمیکنه

parsdarab
جمعه 20 آذر 1394, 00:20 صبح
تایمر استفاده نشده

parsdarab
جمعه 20 آذر 1394, 00:21 صبح
کجاش کار نمیکنه

cmsdqq2
جمعه 20 آذر 1394, 00:25 صبح
به این صورت هست

137388

cmsdqq2
جمعه 20 آذر 1394, 00:26 صبح
تایمر استفاده نشده

بله درسته، بنده اون متن رو نوشتم تا بگم هدف قطع شدن نخ پس از اتمام پردازش هست، نه اینکه دستی زمان بدیم

parsdarab
جمعه 20 آذر 1394, 00:28 صبح
:متفکر: جیگر اسم فرماتو عوض کن

name space ها رو اضافه کن

cmsdqq2
جمعه 20 آذر 1394, 00:31 صبح
دیگه اینقدر بلدم :لبخندساده:

بحث اینجاس که ما توی WPF چیزی به اسم Current Thread، Form_logo و ... نداریم.

cmsdqq2
جمعه 20 آذر 1394, 00:44 صبح
کسی نیست مولتی تردینگ در WPF رو انجام داده باشه؟

parsdarab
جمعه 20 آذر 1394, 00:55 صبح
البته جای کار داره دیگه حوصلم نشد بیشتر کار کنم




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;


namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{


InitializeComponent();
}


private void Button_Click(object sender, RoutedEventArgs e)
{


Window1 Frm_t = new Window1();


this.Dispatcher.Invoke((Action)(() =>
{
Frm_t.Show();
}));


Thread.Sleep(5000);
Frm_t.Close();


}
}
}

cmsdqq2
جمعه 20 آذر 1394, 12:56 عصر
بنده انجام دادم، برنامه رو اجرا کردم اما نخ ها عمل نکردن

cmsdqq2
جمعه 20 آذر 1394, 15:17 عصر
بنده تا اینجا پیش رفتم. فقط معادل Method Invoker رو میخوام

http://barnamenevis.org/attachment.php?attachmentid=137397&d=1449836163