PDA

View Full Version : سوال: مشکل در تایمر



fortex
یک شنبه 01 اردیبهشت 1392, 08:27 صبح
سلام دوستان چند تا تایمر توی برنامه دارم که بعد از یه مدتی فاطی میکنن دیر و زود اجرا میشن علتشون چیه؟
تایمر ها به صورت یه حلقه هستن . یعنی اولی کدش رو اجرا میکنه بعد تایمر فعلی غیر فعال میشه و بعدی فعال میشه همینطور تا اخر و وقتی میرسه به تایمر اخری کدش اجرا میشه و غیر فعال میشه و تایمر اول اجرا میشه.
بار اول به درستی اجرا میشه اما وقتی حلقه میچرخه میریزه به هم.
interval هاشون هم باهم یکی نیست.

amirzandi
یک شنبه 01 اردیبهشت 1392, 09:36 صبح
شما بهتر هست که از thread استفاده کنید. بعد از اینکه هر Timer.Tick اجرا شد ، یک thread را اجرا کنید و منتظر باشید که Thread کارش تمام شود و با استفاده از Delegate های thread، تایمر دیگری را اجرا کنید. به همین ترتیب تا آخر

fortex
یک شنبه 01 اردیبهشت 1392, 09:44 صبح
تاحالا از thread استفاده نکردم. ازکجا شروع کنم؟ منظورم آموزشش هست

amirzandi
یک شنبه 01 اردیبهشت 1392, 09:56 صبح
http://stackoverflow.com/questions/363377/how-do-i-run-a-simple-bit-of-code-in-a-new-thread

vaheeed
یک شنبه 01 اردیبهشت 1392, 09:57 صبح
یه خورده جستجو کن راه میوفتی من خودم همیشه از این نمونه برنامه کوچیک استفاده میکنم راحت میشه فهمید باید چیکار کرد واسه اشنایی

amirzandi
یک شنبه 01 اردیبهشت 1392, 10:13 صبح
اگر دیدین نتونستین من یک نمونه از چیزی که می خواین بزارم - چون توی این تکنیک Invoke کردن و استفاده از Delegate ها خیلی مهم هست.

fortex
یک شنبه 01 اردیبهشت 1392, 11:02 صبح
نتوستم دوست عزیز . چون تازه با این thread اشنا شدم طول میکشه تا بفهممش . اگه میشه لطف کنید برام بزارید. ممنون

amirzandi
یک شنبه 01 اردیبهشت 1392, 11:11 صبح
اینجا برات گذاشتم.
http://amirzandi.blog.com/?p=206

sepehr.kal
دوشنبه 27 خرداد 1392, 15:32 عصر
دوستنان من در برنامه ام چند تایمر ایجاد کردم همه درست کارشون رو انجام میدن اما یکی از این تایمر ها فعال که شد دیگه false نمیشه علت چی هستش ؟

tooraj_azizi_1035
دوشنبه 27 خرداد 1392, 16:22 عصر
سلام
شما باید به جای استفاده از تایمر از ContinuationTasks به طور زنجیروار استفاده کنید:

using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;

namespace ContinueWith
{
class Continuations
{
static void Main()
{
SimpleContinuation();

Console.WriteLine("Press any key to exit");
Console.ReadKey();
}

static void SimpleContinuation()
{
string path = @"C:\users\public\TPLTestFolder\";
try
{
var firstTask = new Task(() => CopyDataIntoTempFolder(path));
var secondTask = firstTask.ContinueWith((t) => CreateSummaryFile(path));
firstTask.Start();
}
catch (AggregateException e)
{
Console.WriteLine(e.Message);
}
}

// A toy function to simulate a workload
static void CopyDataIntoTempFolder(string path)
{
System.IO.Directory.CreateDirectory(path);
Random rand = new Random();
for (int x = 0; x < 50; x++)
{
byte[] bytes = new byte[1000];
rand.NextBytes(bytes);
string filename = Path.GetRandomFileName();
string filepath = Path.Combine(path, filename);
System.IO.File.WriteAllBytes(filepath, bytes);
}
}

static void CreateSummaryFile(string path)
{
string[] files = System.IO.Directory.GetFiles(path);
Parallel.ForEach(files, (file) =>
{
Thread.SpinWait(5000);
});

System.IO.File.WriteAllText(Path.Combine(path, "__SummaryFile.txt"), "did my work");
Console.WriteLine("Done with task2");
}

static void SimpleContinuationWithState()
{
int[] nums = { 19, 17, 21, 4, 13, 8, 12, 7, 3, 5 };
var f0 = new Task<double>(() => nums.Average());
var f1 = f0.ContinueWith(t => GetStandardDeviation(nums, t.Result));

f0.Start();
Console.WriteLine("the standard deviation is {0}", f1.Result);
}

private static double GetStandardDeviation(int[] values, double mean)
{
double d = 0.0;
foreach (var n in values)
{
d += Math.Pow(mean - n, 2);
}
return Math.Sqrt(d / (values.Length - 1));
}
}
}



بیشتر: http://msdn.microsoft.com/en-us/library/dd537612.aspx

sepehr.kal
سه شنبه 28 خرداد 1392, 00:29 صبح
مرسی
نمیشه یه کاری روی timer انجام داد که false بشه ؟ یه کار آسون تر؟