PDA

View Full Version : برنامه یادآوری



nasim bahari
پنج شنبه 28 مرداد 1389, 10:01 صبح
سلام..........

من یه جدول دارم که حاوی یه فیلد تاریخ و یه فیلد ساعت هستش و یه فیلد متن.........

در واقع این جدول برای یه برنامه کوچیک یادآوری هستش......که اون متن رو باید در تاریخ و ساعت مورد نظر یادآوری کنه...........

تایمر........نه

فکر می کنم با ریجستری بشه...........هم اکنون نیازمند یاری سبزتان هستیم.......

nasim bahari
پنج شنبه 28 مرداد 1389, 10:41 صبح
سلام........

ممنونم دوستان.............

سامان جان .........برای این کار باید از یه تایمر استفاده بکنم......... 1 روز رو تبدیل به ثانیه بکن ...اونوقت میدونی باید چند بار تایمر تیک بزنه...........

بازم ممنونم.........

کمک فوری......

Saman_12
پنج شنبه 28 مرداد 1389, 10:42 صبح
شرمنده من حواسم به تایمرش نبود!! :اشتباه:

ricky22
پنج شنبه 28 مرداد 1389, 11:00 صبح
سلام
سوال جالبیه :)
----------------------------
من یکم جستجو کردم.
این برنامه به زبان C# نوشته شده.
شاید بتونید از کدهای Reminder اون الگو بگیرید و به به Vb.net تبدیل کنید.
Address Book and Events Reminder (http://www.codeproject.com/KB/applications/Dot_Net_AddressBook.aspx)


http://www.codeproject.com/KB/applications/Dot_Net_AddressBook/image010.png-------------------------------
ببخشید شما چرا انقدر اخر جملاتتون ............. می گزارید؟
موفق باشید.

ricky22
پنج شنبه 28 مرداد 1389, 11:03 صبح
این هم یک Reminder مفصل برای VB.NET
http://www.a1vbcode.com/app-4407.asp
_____________________________________ (http://www.a1vbcode.com/app-4407.asp)
یک راه بهتر پیدا کردم.
Windows service and timer (http://stackoverflow.com/questions/246697/windows-service-and-timer)

پست دوم سوال که Marked as answer شده را مطالعه بفرمایید.
موفق باشید.

nasim bahari
پنج شنبه 28 مرداد 1389, 11:40 صبح
سلام.....ریکی جان......

اون برنامه ای که با VB بود رو نیگاه کردم......بازم از تایمر استفاده می کرد........

دوستان توجه کنند که من با کار با ساعت و یا تاریخ و همچنین پایگاه داده مشکلی ندارم...فقط مسئله استراتژی یادآوری هستش..........

راستی ....اگه میشه....یه نیگاهی به برنامه C بنداز . آخه ما سوات زبان C نداریم......ممنون میشم........

سامان جان ....شما هم ما رو فراموش نکن........

Saman_12
پنج شنبه 28 مرداد 1389, 11:41 صبح
خوب من یکم فکر کردم دیدم که همون روشی که گفتم جواب میده شما این Sub رو توی برنامتون تعریف کنید :


Public Sub TimerSTring(ByVal Time As String, ByVal Date_ As String)
Do While Time <> "" And Date_ <> ""
Application.DoEvents()
Dim TimeNow As String = Mid(System.DateTime.Now.ToLongTimeString, 1, 8)
Dim DateNow As String = System.DateTime.Today
If Date_ = DateNow And TimeNow = Time Then
MsgBox("Time Now : " & Date.Today & System.DateTime.Now.ToLongTimeString)
End If
Loop
End Sub

خوب حالا هر جا که دوست داشتید این جوری ازش استفاده کنید :

TimerSTring("12:08:50", Date.Today)
فقط جهت احتیاط از اون توی فورم لود استفاده نکنید.
در ضمن توی FormClosing از کلمه End استفاده کنید تا برنامه به تور کامل بسته شه.
حالا فکر می کنم نه نیازی به شرمندگی باشه نه اون همه کد.:بامزه::لبخند::قلب:

ricky22
پنج شنبه 28 مرداد 1389, 11:49 صبح
خوب من یکم فکر کردم دیدم که همون روشی که گفتم جواب میده شما این Sub رو توی برنامتون تعریف کنید :


Public Sub TimerSTring(ByVal Time As String, ByVal Date_ As String)
Do While Time <> "" And Date_ <> ""
Application.DoEvents()
Dim TimeNow As String = Mid(System.DateTime.Now.ToLongTimeString, 1, 8)
Dim DateNow As String = System.DateTime.Today
If Date_ = DateNow And TimeNow = Time Then
MsgBox("Time Now : " & Date.Today & System.DateTime.Now.ToLongTimeString)
End If
Loop
End Sub
خوب حالا هر جا که دوست داشتید این جوری ازش استفاده کنید :

TimerSTring("12:08:50", Date.Today)فقط جهت احتیاط از اون توی فورم لود استفاده نکنید.
در ضمن توی FormClosing از کلمه End استفاده کنید تا برنامه به تور کامل بسته شه.
حالا فکر می کنم نه نیازی به شرمندگی باشه نه اون همه کد.:بامزه::لبخند::قلب:
برادر من.
ایشون تاریخ تولد بنده را در پایگاه ذخیره کردند.
تاریخ تولد من 31 شهریور هست.
حالا می خوان اون تاریخ به من تبریک بگن از امروز تا 31 شهریور چطوری می توانند با این کد شما بررسی کنند ؟

Saman_12
پنج شنبه 28 مرداد 1389, 11:58 صبح
برادر من.
ایشون تاریخ تولد بنده را در پایگاه ذخیره کردند.
تاریخ تولد من 31 شهریور هست.
حالا می خوان اون تاریخ به من تبریک بگن از امروز تا 31 شهریور چطوری می توانند با این کد شما بررسی کنند ؟
خوب 31 شهریور رو به میلادی حساب کنید بعد هم جای Date.Today بزارید.
بعد هم برنامه رو استارت آپ کنید توی FormShwon هم از کد استفاده کنید بعید می دونم مشکلی پیش بیاد.(درضمن بگم که من تازه .net رو شروع کردم اگه اشباه ی دییدد اشتباه رو گوش زد کنید کافیه!)
درضمن شما 1 نکته رو فرا موش کردی اونم اینه که اگه ساعت تولدتون رو ندید چجوری ایشون بهتون تبریک بگن؟؟؟؟؟؟؟؟؟؟:قهقهه::قهقهه:

ricky22
پنج شنبه 28 مرداد 1389, 12:00 عصر
سلام.....ریکی جان......

اون برنامه ای که با VB بود رو نیگاه کردم......بازم از تایمر استفاده می کرد........

دوستان توجه کنند که من با کار با ساعت و یا تاریخ و همچنین پایگاه داده مشکلی ندارم...فقط مسئله استراتژی یادآوری هستش..........

راستی ....اگه میشه....یه نیگاهی به برنامه C بنداز . آخه ما سوات زبان C نداریم......ممنون میشم........

سامان جان ....شما هم ما رو فراموش نکن........
اینی که از Timer استفاده نکنید ممکن نیست.
اما می تونید با ترکیب اون با Window Service و Thread بهینه استفاده کنید که نخواید هر ثانیه چک کنی.
لطفا به لینک هایی که می گزارم الطفات بیشتری داشته باشید!
http://www.vbdotnetheaven.com/uploadfile/ajifocus/appscheduler12062006233037pm/appscheduler.aspx
--------------------------------------
(http://quartznet.sourceforge.net/) Quartz.NET - Enterprise Job Scheduler for .NET Platform (http://quartznet.sourceforge.net/)


این لینک یک پروژه Open Source در SourceForge هست که برای دریافت اون باید از ف:لبخند:ی:لبخند:لتر شکن استفاده کنید.
---------------------------------------------------------
این کد همون کد C#‎ هست که شما فرمودید متوجه نشدید.

Imports System.Threading

Class TimerExample
Private Shared Sub Main()
Dim autoEvent As New AutoResetEvent(False)
Dim statusChecker As New StatusChecker(10)

' Create the delegate that invokes methods for the timer.
Dim timerDelegate As New TimerCallback(AddressOf statusChecker.CheckStatus)

' Create a timer that signals the delegate to invoke
' CheckStatus after one second, and every 1/4 second
' thereafter.
Console.WriteLine("{0} Creating timer." & vbLf, DateTime.Now.ToString("h:mm:ss.fff"))
Dim stateTimer As New Timer(timerDelegate, autoEvent, 1000, 250)

' When autoEvent signals, change the period to every
' 1/2 second.
autoEvent.WaitOne(5000, False)
stateTimer.Change(0, 500)
Console.WriteLine(vbLf & "Changing period." & vbLf)

' When autoEvent signals the second time, dispose of
' the timer.
autoEvent.WaitOne(5000, False)
stateTimer.Dispose()
Console.WriteLine(vbLf & "Destroying timer.")
End Sub
End Class

Class StatusChecker
Private invokeCount As Integer, maxCount As Integer

Public Sub New(count As Integer)
invokeCount = 0
maxCount = count
End Sub

' This method is called by the timer delegate.
Public Sub CheckStatus(stateInfo As [Object])
Dim autoEvent As AutoResetEvent = DirectCast(stateInfo, AutoResetEvent)
Console.WriteLine("{0} Checking status {1,2}.", DateTime.Now.ToString("h:mm:ss.fff"), (System.Threading.Interlocked.Increment(invokeCoun t)).ToString())

If invokeCount = maxCount Then
' Reset the counter and signal Main.
invokeCount = 0
autoEvent.[Set]()
End If
End Sub
End Class

ricky22
پنج شنبه 28 مرداد 1389, 12:02 عصر
خوب 31 شهریور رو به میلادی حساب کنید بعد هم جای Date.Today بزارید.
بعد هم برنامه رو استارت آپ کنید توی FormShwon هم از کد استفاده کنید بعید می دونم مشکلی پیش بیاد.(درضمن بگم که من تازه .net رو شروع کردم اگه اشباه ی دییدد اشتباه رو گوش زد کنید کافیه!)
د
برادر من
خب حالا روز رو میشه با این راه شما چک کرد(اونم با کلی حرف و حدیث) ساعت و دقیقه چی؟

رضمن شما 1 نکته رو فرا موش کردی اونم اینه که اگه ساعت تولدتون رو ندید چجوری ایشون بهتون تبریک بگن؟؟؟؟؟؟؟؟؟؟:قهقهه::قهقهه:
:خجالت:

Saman_12
پنج شنبه 28 مرداد 1389, 12:15 عصر
ببین ricky22 جون من که گفتم تازه کارم.ولی هرچی فکر می کنم مشکلی نمی بینم خوب ساعت و دقیقه که تکلیف شون روشنه!!
حالا اگه به طور مثال کامپیوتر توی اون دقیقه خاموش بود میتونید یه If بزارید که چک کنه اگه تایم کامپیو تر بیشتر از تایم ما بود اون وقت هم پیام رو نشون بده.
میشه یکم بیشتر توضیح بدی مشکل کجاست(این موضوع رو فقط برای یاد گیری دنبال میکنم و کمک کردن به یک دوست نه چیزه دیگه ای!)؟

nasim bahari
پنج شنبه 28 مرداد 1389, 12:50 عصر
سلام.........دوستان

فکر می کنم راه حل رو پیدا کردم.....از تایمر استفاده نمیشه..........وقتی برنامه رو تکمیل کردم..............اونو می زارم...........ممنون از همکاریتون......

Mani_rf
پنج شنبه 28 مرداد 1389, 13:00 عصر
من برای این کار یک بار از این روش استفاده کردم:

1- هنگام شروع برنامه مناسب هایی که قرار بود در آن روز یاد آوری شود را لود کردم.
2- اگر مناسبت داشت و در ساعت خاصی نیاز به یادآوری داشت به لیستی اضافه میشد.
3- اختلاف ساعت موارد لیست با ساعت جاری چک میشد.
اگر موردی با کمتر از یک ساعت وجود داشت، تایمری دیگر فعال میشد که هر 3دقیقه یک بار لیست را چک میکرد تا در به هنگام رسیدن به ساعت مقرر یادآوری لازم را انجام دهد. سپس آن مورد از لیست حذف میشد. و تایمر 3دقیقه ای غیر فعال میشد.
4- اگر موردی در لیست بود که بیش از یک ساعت به دخداد آن مانده بود، یک تایمر که هر یک ساعت یک بار اجرا میشد لیست را چک میکرد، در صورت رسیدن به ساعتی که در آن یادآوری باید انجام شود، تایمر 3دقیقه ای فعال میشود.
5- این روند تا هنگام خالی شدن لیست ادامه پیدا میکرد

مزایا :
1- شی تایمر حتی با Interval طولانی حافظه همچنین پردازشگر را مشغول نمی کند.
2- موقع خطا یابی برنامه تایمر وسط کار شما نمی پرد.
3- چون کد ها با فاصله زیاد اجرا میشوند سرعت برنامه شما پایین نمی آید.

ایراد ها :
1- خطای زمانی استفاده از این روش معادل حداکثر 3 دقیقه است که با استفاده از یک تایمر سوم و کمی دستکاری در الگوریتم کاملا قابل حل است + اینکه برنامه هایی مانند Outllook هم با همین خطای زمانی عمل می کنند.

2- اگر برنامه یک روز کامل بسته نشود اطلاعات روز جدید خوانده نمی شوند. که با کمی تغییر این هم قابل حل است. مثلا فراخوانی امروز و 3روز آیند به جای روز جاری

این روش را به راحتی می توانید پیاده کنید، با کمی تغییر در این الگوریتم به راحتی میتوانید همان چزی که نیاز دارید را داشته باشید.

nasim bahari
جمعه 29 مرداد 1389, 00:29 صبح
دوستان....سلام

من با نظر جناب Mani_Rf موافقم.........

کس دیگه ای نظر نداره ؟ یه جوری می خوام تعداد تیک زدن تایمر رو به حداقل برسونم ... آخه من توی برنامه ام چند تا تایمر دارم.

با تشکر