PDA

View Full Version : سوال: بروز زمان استفاده و باقیمانده از سیستم توسط کاربر



tanha2007
دوشنبه 23 آذر 1388, 21:06 عصر
سلام
من دارم روی یک پروژه برای یک سنتر کامپیوتر کار میکنم. و روش کار به این صورت است که کاربر میاد و راجستر میشه و براش یک تاریخ و زمان استفاده ازکامپیوتر در نظرگرفته میشود. و هرگاه کاربر بخواهد از کامپیوتر استفاده نماید تاریخ و زمان ورود به کامپیوتر در بانک داده ذخیره میگردد

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

سوال این جاست: که چگونه داخل این لیست زمان استفاده و باقیمانده از هرکاربر را نمایش داده و همزمان بروز گردد، و هرگاه وقت یک کاربر تمام میشود به صورت خودکار از لیست حذف گردد.

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

برای معلومات بیشتر به فایل ضمیمه نگاه نمایید

tanha2007
دوشنبه 23 آذر 1388, 21:10 عصر
کویری لیست کامپیوترهای در حال استفاده:




SELECT user.user_id, user.photo, user.user_type, user.first_name, user.last_name, pc.pc_name, user.expiration_datetime, user_pc.login_datetime, user_pc.logout_datetime, user_pc.id " +
"FROM user " +
"INNER JOIN (pc INNER JOIN user_pc ON pc.pc_id = user_pc.pc_id) " +
"ON user.user_id = user_pc.user_id " +
"WHERE (( user_pc.logout_datetime = '' ))

tanha2007
سه شنبه 24 آذر 1388, 02:11 صبح
سلام مجدد،

لطفا اگر امکان دارد رهنمایی نمایید؟ شاید کسی از شما به این مشکل قبلا برخورد کرده باشد .

من نمیدانم دقیقا Thread, Timer, or BackgroundWorker میتواند راه حل باشد .

hamedsabzian
سه شنبه 24 آذر 1388, 10:37 صبح
به نظر من بهترین راه استفاده از dobackgroundworker یا thread ست. هیچ کدوم سخت نیست ولی dobackgroundworker راحت تره. در مورد طریقه ی استفاده از اونا هم همین جا یه search بکنی، جواب میگیری.
فقط میمونه یه موضوع اونم اینه که توی تابعی که میخوای به صورت thread اجرا بشه باید مشخص کنی که مثلا هر 5 ثانیه یک بار اجرا بشه:

دوم اینکه برای بروز کردن مقادیر میتونی هم روی دیتا بیس کوئری بزنی و بعد گریدویو رو ۀپدیت کنی ، و هم با مقادیر موجود در گرید کار کنی و مثلا هر دو یک دقیقه یک بار دیتابیس رو بروز کنی. بسته به حجم اطلاعاتت می تونی یکی رو انتخاب کنی.

tanha2007
سه شنبه 24 آذر 1388, 11:37 صبح
تشکر
خوب درین صورت من باید کل داده ها را نیز آپدیت نمایم؟

آیا میشه کاری کرد که کمی بهتر بهینه باشد ؟

tanha2007
چهارشنبه 25 آذر 1388, 01:54 صبح
سلام مجدد.
من کوشش کردم که این کار با استفاده از تایمر انجام دهم و شد ولی بهینه نیست.

زمانیکه من لیست اطلاعات را از داتابیس میگیرم تاریخ login و expiration هر کاربر گرفته و به یک تابع میفرستم که براساس آنها زمان استفاده و باقیمانده را محاسبه مینماید و من اون مقدار در داخل سطر اون کاربر قرار میدهم.

ولی مشکل اینجاست که من هر ثانیه زمان باقیمانده و استفاده از سیستم را آپدیت مینمایم و این باعث میشود که کل اطلاعات دوباره از داتابیس خوانده شوند.

من نمیدانم باید از روشی استفاده نمایم که بهینه تر و منطقی باشد؟ منتظر رهنمایی شما هستم :)

sky_in_iran
چهارشنبه 25 آذر 1388, 11:32 صبح
سلام دوست عزيز
شما از mvc استفاده كنيد . خوبي اين كاراينه كه نه نيازي به تايمر داري نه نيازي به اتصال به db هر كاربري on شد شما ميتوني به همه كاربرا خبر بدي و اونجايي كه داري به همه خبر ميدي اطلاعات اون نفرم تو db ذخيره كني كه چه ساعتي اومد يا رفت خوبي اين روش اينه كه تو اصلا با ui كاري نداري و همه كارا پشته پرده انجام ميشه و نتيجه به ui ارسال ميشه در كل در اين روش شما از event استفاده مي كني به نظرم اين روش هم خيلي بهينست و هم خيلي كاربردي
موفق و پيروز باشيد

tanha2007
چهارشنبه 25 آذر 1388, 15:41 عصر
سلام و تشکر.

من دقیقا از ساختار MVC استفاده مینمایم.

یعنی اینکه من یک کلاس دارم که قسمت logic یعنی داتابیس است و تابع که لیست کامپیوترهای مصروف به صورت آرایه بر میگرداند درین کلاس قرار دارد.

و کلاس دیگر است بنام Handler که تابع getTimeDurationandLeft در آن قرار دارد.

و بالآخره یک پروسیجر در فرم دارم که اطلاعات کامپیوترهای مصروف در لیست قرار میدهد.

sky_in_iran
پنج شنبه 26 آذر 1388, 08:44 صبح
دوست عزيز اگه از اين روش استفاده ميكني پس ديگه مشكلي نبايد باشه نيازيم به تايمر نيست پس مشكل شما الان كجاست ؟ ميشه بيشتر توضيح بدين

tanha2007
پنج شنبه 26 آذر 1388, 13:10 عصر
تشکر و سلام مجدد.

من قسمت پروژه را که مربوط من میشد درین جا ضمیمه مینمایم تا دوستان بهتر بتوانند مشکل را بررسی نمایند.

1. داتابیس من MySQL است. و خود داتابیس را میتوانید از فایل ضمیمه گرفته و در MySQL کویری نمایید. برای تغییرات نام کاربری و پسورد و نام داتابیس به کلاس SqlManager.cs مراجعه نمایید.

2. برای اینکه بتوان از C Sharp با MySQL کار کرد باید MySQL.dll را به Reference اضافه نمایید. من با Visual C# 2008 کارمینمایم.


3. پروژه درست کار مینماید ولی مشکل اینجاست که برای اینکه زمان استفاده و زمان باقیمانده کاربران را هر لحظه آپدیت نماییم باید لیست همه کاربران را دوباره از داتابیس خواند.

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

چرا هر لحظه آپدیت؟
1. خوب امکان این است که هر لحظه کاربر کامپیوتر را ترک گوید و اون کامپیوتر باید به لیست کامپیوترها آزاد شامل گردد.

2. امکان این هم است که یک کاربر جدید آمده و روی یک کامپیوتر کار نماید.

3. خوب اینکه کاربران لحظه ای که به کامپیوتر login میشوند و باید اون کامپیوتر بنام اون کاربر در داتابیس ذخیره گردد وظیفه من نیست، ولی باید مشخصات اون کاربر و آپدیت زمان استفاده و باقیمانده وظیفه من است.

امید که الان بعد ازینکه پروژه اجرا نمایید همه چیز روشن باشد :)

منتظر نظرات هستم. تشکر

ahmadsam
پنج شنبه 26 آذر 1388, 13:51 عصر
اولا همون طوری که گفتی استفاده از تایمر اصلا بهینه نیست در ادامه باید بگم قسمت نا مفهوم برنامه تو اینجاست که آیا هر کاربر زمان معینی دارد و یا همه کاربران برای استفاده از سیستم یک زمان ثابت بهره می برند اگر این بخش ها روشن بشه می تونی با یک جدول براحتی اطلاعات همه کاربران را در آن ثبت و نگهداری کنی

tanha2007
پنج شنبه 26 آذر 1388, 14:31 عصر
کاربران فرض نمایید برایشان تاریخ انقضا تعیین شده مثلا یک کاربر میتواند برای یک ساعت ازسیستم استفاده نماید یا اینکه یک روز یا اینکه یک ماه و غیره نظر به تاریخ انقضا یا همون expiration_datetime


خوب خواهد یک بار پروژه را بر رسی نمایید و مرا درقسمت مشکل اصلی همکاری نمایید. تشکر

tanha2007
پنج شنبه 26 آذر 1388, 21:37 عصر
من فکر کنم پروژه های مثل کافی نت و تلفن خانه های مثل این کار را انجام میدهند. خوب باید یکی بااین قسم مشکل قبلا برخورد کرده باشد.

sky_in_iran
جمعه 27 آذر 1388, 12:41 عصر
دوست عزيز به نظر من شما يك تايمر بايد بزاري كه اين تايمرت با ساعت و تاريخ سيستم يا سرور هماهنگ باشه و هر وقت يكي به برنامه وارد شد خروجيش معلومه كيه در زمان ورود اطلاعات و بده به تايمر و يك if بزار كه اگر به زمان مورد نظر رسيد ديگه اجازه كار با سيستم و نده نيازي نيست براي هركدوم يك تايمر بزاري البته اين روش به فكر من رسيد چون شما به يك تايمر نياز داري اگه بخواي از thread استفاده كني به مشكل delly ميخوري

tanha2007
جمعه 27 آذر 1388, 16:46 عصر
تشکر دوست گرامی.
خوب منم دقیقا یک تایمر دارم. میشه لطفا به پروژه ضمیمه شده یک نگاه بیاندازید در صفحه قبل است :-)