View Full Version : استفاده از تایمر یا BackgroundWorker برای اجرای یه متد در کل زمان اجرای برنامه
PetekDincos
جمعه 20 مرداد 1391, 23:40 عصر
با سلام
در یک برنامه که از چندین فرم تشکیل شده یک فرم اصلی داریم و بقیه فرم ها ، فرم های فرعی می باشند که از داخل این فرم اصلی ShowDialog می شوند من می خوام برای اجرای یک متد در کل زمان اجرای برنامه ، برای تک تک فرم ها از یه تایمر جداگانه استفاده کنم این تایمر ها رو چطور بنویسم که تداخلی با هم نداشته باشند و وقتی در فرم اصلی هستم و تایمر مربوط به آن در حال اجرا است و زمانیکه یک فرم فرعی رو ShowDialog می کنم می خوام تایمر مربوط به فرم اصلی متوقف شده و تایمر مربوط به فرم فرعی اجرا بشه و بعد از بستن فرم فرعی ، تایمر مربوط به فرم اصلی دوباره اجرا بشه و نیز می خوام این متد دقیقا در کل زمان اجرای برنامه در فاصله زمانی مثلا 1000 میلی ثانیه ، اجراش تکرار بشه و تمامی فرم های که در روند اجرای برنامه باز یا بسته می شن تاثیری در این فاصله زمانی نداشته باشن و دقیقا این فاصله زمانی رعایت بشه . ممنون می شم اگر راهنمایی بفرمایید با تشکر
the king
شنبه 21 مرداد 1391, 00:44 صبح
با سلام
در یک برنامه که از چندین فرم تشکیل شده یک فرم اصلی داریم و بقیه فرم ها ، فرم های فرعی می باشند که از داخل این فرم اصلی ShowDialog می شوند من می خوام برای اجرای یک متد در کل زمان اجرای برنامه ، برای تک تک فرم ها از یه تایمر جداگانه استفاده کنم این تایمر ها رو چطور بنویسم که تداخلی با هم نداشته باشند و وقتی در فرم اصلی هستم و تایمر مربوط به آن در حال اجرا است و زمانیکه یک فرم فرعی رو ShowDialog می کنم می خوام تایمر مربوط به فرم اصلی متوقف شده و تایمر مربوط به فرم فرعی اجرا بشه و بعد از بستن فرم فرعی ، تایمر مربوط به فرم اصلی دوباره اجرا بشه و نیز می خوام این متد دقیقا در کل زمان اجرای برنامه در فاصله زمانی مثلا 1000 میلی ثانیه ، اجراش تکرار بشه و تمامی فرم های که در روند اجرای برنامه باز یا بسته می شن تاثیری در این فاصله زمانی نداشته باشن و دقیقا این فاصله زمانی رعایت بشه . ممنون می شم اگر راهنمایی بفرمایید با تشکر
اینکه سوال تون چه ربطی به انجمن WPF داره رو نفهمیدم.
کد Program.cs رو باز می کنید، چیزی شبیه به اینه :
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.Run(new Form1());
}
اینطوری تغییرش می دهید :
static void Main()
{
System.Threading.Thread thread = new System.Threading.Thread(TickProc);
thread.Start();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);
Application.Run(new Form1());
}
[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SendMessageA")]
private static extern int SendMessage(int hWnd, int wMsg, int wParam, int lParam);
private delegate int GetHandleDelegate();
private static int GetHandle()
{
try
{
return System.Windows.Forms.Form.ActiveForm.Handle.ToInt3 2();
}
catch
{
return 0;
}
}
private static void TickProc(object value)
{
do
{
for (int i = 0; i < 4; i++)
{
System.Threading.Thread.Sleep(250);
if (Application.OpenForms.Count == 0)
{
return;
}
}
Form f = System.Windows.Forms.Form.ActiveForm;
if (f != null)
{
int hWnd = (int)f.Invoke(new GetHandleDelegate(GetHandle), null);
if (hWnd != 0)
{
SendMessage(hWnd, 123456, 0, 0);
}
}
} while (true);
}
الان یک Thread جدید وظیفه داره که هر ثانیه یکبار یک پیغام (سیگنال) با کد پیغام 123456 رو به فرم فعال پروژه تون ارسال کنه.
کاری هم نداره که کی کدوم فرم بسته میشه و کدوم باز میشه، سر موعد پیغام رو ارسال می کنه.
حالا این کدی است که داخل کلاس های فرم هاتون اضافه می کنید تا فرضا توی عنوان فرم هر ثانیه یک * اضافه کنه :
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 123456)
{
Text += "*";
}
}
PetekDincos
شنبه 21 مرداد 1391, 09:57 صبح
با سلام
دوست عزیز شما از یه تایمر استفاده کردید و من نمی خوام از یه تایمر استفاده کنم و می خوام برای هر فرم از تایمر جداگانه استفاده کنم و دلیلش هم به خاطر مسائل امنیتی نرم افزار می باشه . اگر دوستان دیگه ای در این زمینه اطلاعی دارند ممنون می شم راهنمایی بفرمایند و در ضمن چون من WPF کار می کنم به خاطر همین در این تالار سوالاتم رو مطرح می کنم . با تشکر
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.